今天写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是一个常量,是安全可用的,因此就不会抛出上述错误,故解决。