gpt4 book ai didi

java - 无法在不同方法中定义的内部类中引用非最终变量 i

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:51:21 25 4
gpt4 key购买 nike

我有“无法在不同方法中定义的内部类中引用非最终变量 i”错误...我哪里出错了?...我刚开始学习 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");

}
});
}



}

}

最佳答案

错误消息准确说明了问题所在:i 变量不是最终变量,但您正试图在匿名内部类中引用它。

你可以这样做:

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");
}
});
}
}

这里我们获取变量 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");
}
});
}
}

来自 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.

关于java - 无法在不同方法中定义的内部类中引用非最终变量 i,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5997953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com