forint i=1;i=13;i++ int temp = i; Runnable r = new Runnable public void run SystemoutprintlnThreadcurrentThreadgetName+--+i; ; poolexecuter; 为什么i报错每次给temp赋值不也是在变吗
在这段代码中,i出现错误是因为在匿名内部类中,对于外部变量i的访问是通过复制的方式进行的。在Java中,当在匿名内部类中访问外部变量时,该变量必须是final或者事实上是final的。
在这段代码中,尽管每次循环都会给temp赋值,但是在匿名内部类中使用的变量是i而不是temp。由于i在循环中是一个可变的变量,因此无法在匿名内部类中使用。这是因为匿名内部类的对象可能在循环结束后才会被执行,而此时循环已经结束,i的值可能已经改变。
为了解决这个问题,可以将int i声明为final或者将其转换为局部变量,然后在匿名内部类中使用该局部变量。
可以使用以下两种方法解决这个问题:
- 将int i声明为final:
for(int i=1;i<=13;i++) {
final int temp = i;
Runnable r = new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName()+"--"+temp);
}
};
pool.execute(r);
}
- 将int i转换为局部变量:
for(int i=1;i<=13;i++) {
int temp = i;
Runnable r = new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName()+"--"+temp);
}
};
pool.execute(r);
}
这样做可以确保在匿名内部类中使用的变量是一个固定的值,而不会受到外部循环的影响
原文地址: https://www.cveoy.top/t/topic/ihsc 著作权归作者所有。请勿转载和采集!