当前位置: 首页 > 知识库问答 >
问题:

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

逑俊楚
2023-03-14
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());
}

共有1个答案

袁雅逸
2023-03-14

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

为此,Java虚拟机向ActionListener添加了一个新变量iteration,即副本。为了防止分配给局部变量迭代会使另一个迭代过时,语言决定局部变量必须是常量,而不是分配给“有效的final”。

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
        public void actionPerformed(ActionEvent e){  
 类似资料:
  • 我正在尝试创建一个I*J数量的按钮。 提前多谢。

  • 我的主类在方法中运行。它运行一个可能需要大量时间才能完成的进程,所以我创建了另一个方法来停止该进程:它只是引发一个标志,使整个进程停止: 为了测试停止进程的方法,我应该采取什么方法来解决这个问题?

  • 问题内容: 我是lambda和Java8的新手。我面临以下错误。 封闭范围中定义的局部变量日志必须是final或有效的final 问题答案: 该消息说,到底是什么问题:你的变量 数 必须是最后的(即:携带关键字决赛),也可以有效地最终(即:你只有一个值分配给它 一旦 拉姆达外)。否则,您将无法在lambda语句中使用该变量。 但是,当然,这与您使用 log 冲突。关键是:您不能在lambda内部写

  • 问题内容: 我收到错误提示,就像在主题中一样,请问如何修复…错误在menuItem循环中,在这里我尝试将textArea前景颜色设置为从menuItem中选择的一种:(colors [mi]) 问题答案: 该错误意味着 您不能在内部类中使用局部变量。 要在内部类中使用变量,必须对其进行声明。只要是循环计数器并且不能分配变量,就必须创建一种变通方法来获取可在内部类内部访问的变量中的值: 因此,您的代

  • 今天我想做一些我想完成的项目,在那里我得到了一个异常,我不能从lambda表达式中引用局部变量。我有一个方法,其中我给出了两个值,该方法检查值对是否已经在HashMap中 当它结束时,我想读出布尔函数,需要知道他是否发现它成立= false我怎样才能在这个lambda中设置founded或者有没有其他方法可以做到这一点?

  • 这个问题在这里已经有了答案: > 为什么匿名类只能访问最终变量? 为什么对于实例变量[重复]忽略“Lambda表达式中使用的变量必须是final或实际上是final”警告 “lambda在start方法参数被垃圾回收后才能运行”是什么意思? 为什么要复制?