【发布时间】:2015-01-05 10:57:30
【问题描述】:
在一个 Android 项目中,我使用下面的代码。我收到错误:variable tts might not have been initialized。如果我更改声明变量 tts 的位置,我将不再收到错误消息。如果我在内部 OnInitListener 类中注释掉引用 tts 的两行,我也不再收到错误(但也没有任何有趣的事情发生)。
所以,我推断,如果tts 变量在封闭方法中声明(即使它被声明为final),我推断内部类不能“看到”它,但是当它声明为时它可以看到它封闭类的实例变量。
我来自 JavaScript 背景;显然,Java 在这种情况下以不同的方式处理变量范围。如果您能解释一下 Java 在幕后所做的事情,我将不胜感激,以便我理解这些差异。
package com.example.texttospeech;
import android.speech.tts.TextToSpeech;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import java.util.HashMap;
import java.util.Locale;
public class MainActivity extends ActionBarActivity {
//private TextToSpeech tts; // UNCOMMENT THIS...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testTextToSpeech();
}
private void testTextToSpeech() {
final String toSpeak = getString(R.string.hello_world);
final int mode = TextToSpeech.QUEUE_FLUSH;
final HashMap hashMap = new HashMap<String, String>();
final TextToSpeech tts; // ... AND COMMENT THIS OUT...
tts = new TextToSpeech(getApplicationContext(),
new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status != TextToSpeech.ERROR) {
// ... OR SIMPLY COMMENT OUT THE NEXT TWO LINES
tts.setLanguage(Locale.UK);
tts.speak(toSpeak, mode, hashMap);
}
}
});
}
}
【问题讨论】:
标签: java android scope inner-classes