7gugu’s blog

日本分站

Java报错Local variable XX defined in an enclosing scope ...

今天写JAVA代码的时候,碰见了一个这么个报错,由于解决方法第一次知晓,故在此留下笔记。

原代码:

[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); } [/java]

原因:

在BUG标识处,我由于使用了一个匿名的未知范围的变量,JAVA编译器就抛出了错误"Local variable i defined in an enclosing scope must be final or effectively final"。

解决方案:

[java] for(int i=0;i<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); } [/java]

通过使用final int j这个中间变量,java8的编译器就会认为j是一个常量,是安全可用的,因此就不会抛出上述错误,故解决。