java 不能在不同方法中定义的内部类中引用非最终变量 i
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5997953/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Cannot refer to a non-final variable i inside an inner class defined in a different method
提问by Sergio
i have "Cannot refer to a non-final variable i inside an inner class defined in a different method" error... Where am i going wrong?... I just started to learn android and java programming..
我有“无法在以不同方法定义的内部类中引用非最终变量”错误......我哪里出错了?......我刚刚开始学习android和java编程..
public class Tictac extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button[] = new Button[9];
button[0]= (Button) findViewById(R.id.button1);
button[1] = (Button) findViewById(R.id.button2);
button[2] = (Button) findViewById(R.id.button3);
button[3] = (Button) findViewById(R.id.button4);
button[4] = (Button) findViewById(R.id.button5);
button[5] = (Button) findViewById(R.id.button6);
button[6] = (Button) findViewById(R.id.button7);
button[7] = (Button) findViewById(R.id.button8);
button[8] = (Button) findViewById(R.id.button9);
final TextView text = (TextView) findViewById(R.id.textView1);
final ImageView img[] = new ImageView[9];
img[0] = (ImageView) findViewById(R.id.img1);
img[1] = (ImageView) findViewById(R.id.img2);
img[2] = (ImageView) findViewById(R.id.img3);
img[3] = (ImageView) findViewById(R.id.img4);
img[4] = (ImageView) findViewById(R.id.img5);
img[5] = (ImageView) findViewById(R.id.img6);
img[6] = (ImageView) findViewById(R.id.img7);
img[7] = (ImageView) findViewById(R.id.img8);
img[8] = (ImageView) findViewById(R.id.img9);
final ImageView imSq[] = new ImageView[9];
imSq[0] = (ImageView) findViewById(R.id.imSq1);
imSq[1] = (ImageView) findViewById(R.id.imSq2);
imSq[2] = (ImageView) findViewById(R.id.imSq3);
imSq[3] = (ImageView) findViewById(R.id.imSq4);
imSq[4] = (ImageView) findViewById(R.id.imSq5);
imSq[5] = (ImageView) findViewById(R.id.imSq6);
imSq[6] = (ImageView) findViewById(R.id.imSq7);
imSq[7] = (ImageView) findViewById(R.id.imSq8);
imSq[8] = (ImageView) findViewById(R.id.imSq9);
for(int i =0;i <=8;i++){
if(i%2==0){
button[i].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
**HERE-->** img[i].setVisibility(2);
text.setText("COOL");
}
});
}
else{
button[i].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
**HERE-->** imSq[i].setVisibility(2);
text.setText("COOL");
}
});
}
}
}
}
}
回答by Jon Skeet
The error message says exactly what's wrong: the i
variable isn't final, but you're trying to refer to it within an anonymous inner class.
错误消息准确地说明出了什么问题:i
变量不是最终的,但您试图在匿名内部类中引用它。
You can do this:
你可以这样做:
for (int i = 0; i <= 8;i++) {
if (i % 2 == 0) {
final int j = i;
button[i].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
img[j].setVisibility(2);
text.setText("COOL");
}
});
}
}
Here we take a copyof the variable i
, and assign it to a final variable j
, which we can then use within the anonymous inner class. Alternatively, if you don't care about the possibility of the array changing, you could do:
在这里,我们获取变量的副本i
,并将其分配给最终变量j
,然后我们可以在匿名内部类中使用该变量。或者,如果您不关心数组更改的可能性,您可以执行以下操作:
for (int i = 0; i <= 8;i++) {
if (i % 2 == 0) {
final ImageView imageView = img[i];
button[i].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
imageView.setVisibility(2);
text.setText("COOL");
}
});
}
}
From section 8.1.3 of the Java Language Specification:
Any local variable, formal method parameter or exception handler parameter used but not declared in an inner class must be declared final. Any local variable, used but not declared in an inner class must be definitely assigned (§16) before the body of the inner class.
任何使用但未在内部类中声明的局部变量、形式方法参数或异常处理程序参数都必须声明为 final。任何在内部类中使用但未声明的局部变量都必须在内部类的主体之前明确分配(第 16 节)。
回答by Sergio
you can create a method, like that:
您可以创建一个方法,如下所示:
private void method(final Button btn, final ImageView img) {
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
img.setVisibility(2);
text.setText("COOL");
}
});
}
and use that in your for i loop. This should work (not tested)
并在您的 for i 循环中使用它。这应该有效(未测试)