无法分配最终的局部变量,因为它是在封闭类型中定义的

ratingS = new JSlider(1, 5, 3); ratingS.setMajorTickSpacing(1); ratingS.setPaintLabels(true); int vote; class SliderMoved implements ChangeListener { public void stateChanged(ChangeEvent e) { vote = ratingS.getValue(); } } ratingS.addChangeListener(new SliderMoved()); 

如果我写上面的代码Eclipse告诉我这个:

不能引用在不同方法中定义的内部类中的非最终变量投票

但如果我在int vote之前添加final ,它会给我这个错误:

无法分配最终的局部变量投票,因为它是在封闭类型中定义的

那么,如何解决?

好吧,标准技巧是使用长度为1的int数组。 使var final并写入var[0] 。 确保不创建数据竞争非常重要。 以您的代码为例:

 final int[] vote = {0}; class SliderMoved implements ChangeListener { public void stateChanged(ChangeEvent e) { vote[0] = ratingS.getValue(); } } 

由于所有这些都将在EDT上发生,包括回调调用,你应该是安全的。 您还应该考虑使用匿名类:

 ratingS.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { vote[0] = ratingS.getValue(); } }); 

vote移至SliderMoved

 class SliderMoved implements ChangeListener { private int vote; public void stateChanged(ChangeEvent e) { this.vote = ratingS.getValue(); // do something with the vote, you can even access // methods and fields of the outer class } public int getVote() { return this.vote; } } SliderMoved sm = new SliderMoved(); ratingS.addChangeListener(sm); // if you need access to the actual rating... int value = rattingS.getValue(); // ...or int value2 = sm.getVote(); 

编辑

或者,将模型类传递给更改侦听器

 public class Person { private String name; private int vote; public int getVote() { return this.vote; } public void setVote(int vote) { this.vote = vote; } // omitting other setter and getter } 

Person使用如下:

  class SliderMoved implements ChangeListener { private Person person; public SliderMoved(Person person) { this.person = person; } public void stateChanged(ChangeEvent e) { this.person.setVote(ratingS.getValue()); } public Person getPerson() { return this.person; } } Person person = new Person(); ratingS.addChangeListener(new SliderMoved(person)); // access the vote int vote = person.getVote(); 

我终于解决了在主类中声明为实例变量(私有)的问题。

将编译器合规性级别设置为1.8对我来说可以解决类似的问题。 我不明白原因,但你可以试试这个。

怎么运行的:

右键单击项目 – > Properties – > Java Compiler。 在java编译器属性窗口中,将编译器合规性级别设置为1.8。