今天写JAVA代码的时候,碰见了一个这么个报错,由于解决方法第一次知晓,故在此留下笔记。
原代码:
for(int i = 0; i < tabName.length; i++) {
Btn = new JButton(tabName[i]);
Btn.setPreferredSize(new Dimension(
100, 25));
Btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tabObj.setSelectedIndex(i); //BUG
}
});
panel.add(Btn);
}
原因:
在BUG标识处,我由于使用了一个匿名的未知范围的变量,JAVA编译器就抛出了错误”Local variable i defined in an enclosing scope must be final or effectively final“。
解决方案:
for(int i = 0; i & amp; lt; tabName.length; i++) {
Btn = new JButton(tabName[i]);
Btn.setPreferredSize(new Dimension(100, 25));
final int j = i; //通过这个转换,把一个无范围的匿名变量转换成final变量 //FIX
Btn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
tabObj.setSelectedIndex(j);//FIX
}
});
panel.add(Btn);
}
通过使用final int j这个中间变量,java8的编译器就会认为j是一个常量,是安全可用的,因此就不会抛出上述错误,故解决。





