在封闭范围中定义的局部变量迭代必须是final或实际上是final



每当我试图编译程序时,我都会得到错误"在封闭范围中定义的局部变量迭代必须是最终的或实际上是最终的";。有人知道怎么解决这个问题吗?代码还没有完成,所以有些东西可能看起来不合适。

public static void go(purchase joe) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SpinnerNumberModel NumberImput = 
new SpinnerNumberModel(1.00,0.00,null,1.00);
int iteration = 0;
JSpinner spinner = new JSpinner(NumberImput);
JLabel label = new JLabel("Please enter the price of the Item.");
JButton button = new JButton("Press here to continue");
button.addActionListener(new ActionListener(){  
public void actionPerformed(ActionEvent e){  
switch (iteration) {
case 0:
joe.setPrice((double)NumberImput.getNumber());
label.setText("Plese enter the amount that you are buying");
NumberImput.setValue(1.00);
iteration += 1;
break;
case 1:
joe.setAmount((int)NumberImput.getNumber());
label.setText("Plese enter the amount that you are buying");
break;



}
}  
});  
frame.setLayout(new FlowLayout());
frame.add(label);
frame.add(spinner);
frame.add(button);
frame.setSize(600, 500);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setVisible(true);
joe.setPrice((double)NumberImput.getNumber());
}

您正在使用iteration += 1;。这是对局部变量的赋值。现在ActionListener对象的寿命比本地变量长;actionPerformed可以在方法的调用消失后调用。

出于这个原因,Java虚拟机向ActionListener添加了一个新的变量iteration,一个副本。为了防止分配给局部变量iteration会使其他iteration过时,该语言决定局部变量必须是常量,而不是分配给";实际上是最终的">

AtomicInteger iteration = new AtomicInteger();
... iteration.getAndIncrement();

但是,当稍后调用actionPerformed时,只需删除iteration即可。您可以在ActionListener中使用字段。

button.addActionListener(new ActionListener() {  
int iter;
@Override
public void actionPerformed(ActionEvent e) {  
switch (iter) {
case 0:
joe.setPrice(NumberImput.getNumber().doubleValue());
label.setText("Please enter the amount that you are buying");
NumberImput.setValue(1.00);
iter++;
break;
case 1:
joe.setAmount(NumberImput.getNumber().intValue());
label.setText("Please enter the amount that you are buying");
break;
}
}  
});  

打开样式:始终使用@Override,因为在类似情况下会捕捉到打字错误。

@Override
public void actionPerformed(ActionEvent e){  

使用numberInput;以小写字母开头的变量、字段和方法。

相关内容

最新更新