[笔记]Java报错Local variable XX defined in an enclosing scope …

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