【问题标题】:"local variables referenced from an inner class must be final or effectively final" in MouseEvent“从内部类引用的局部变量必须是最终的或有效的最终”在 MouseEvent
【发布时间】:2022-11-13 08:09:27
【问题描述】:

我正在尝试从 jtextfield 获取整数输入,并将其设置为单击 jbutton 时计时器 jlabel 的整数,但我在 MouseEvent 方法中不断收到此错误

从内部类引用的局部变量必须是最终的或有效的最终的

代码:

    private void timerStartMouseClicked(java.awt.event.MouseEvent evt) {                                        
        int a = Integer.parseInt(timerInput.getText());
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {         
            public void run() {  
                timeLeft.setText(Integer.toString(a));
                --a;
                if (a == -1){
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
                    timer.cancel();                                       
                } else if(isRunning){
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
                }
            }
        };
    timer.scheduleAtFixedRate(task, 1000, 1000);
    }

我仍然是定时器事件和鼠标事件的新手,我试图将a 声明为全局变量,除非我在方法中声明它是一个值,否则它仍然给我同样的错误,但我需要从 jtextfield 获取输入。

【问题讨论】:

  • 简短的回答是您必须将a 设为最终版本。更长的答案是您不能这样做,因此您需要在匿名类中添加一个变量。

标签: java netbeans mouseevent timertask


【解决方案1】:

未经测试,但我认为这会起作用。

    private void timerStartMouseClicked(java.awt.event.MouseEvent evt) {                                        
        final int a = Integer.parseInt(timerInput.getText());
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {    
            int localCount = a;     
            public void run() {  
                timeLeft.setText(Integer.toString(localCount));
                --localCount;
                if (localCount == -1){
\\\\\\\\\\\\\\\\\\
                    timer.cancel();                                       
                } else if(isRunning){
\\\\\\\\\\\\\\\\\\\
                }
            }
        };
    timer.scheduleAtFixedRate(task, 1000, 1000);
  

发生的事情是 a 是一个局部变量,当此方法结束时将消失在以太中,因此使用它是不安全的。如果变量是final,那么 Java 可以安全地将a的值复制到您的内部类中。但是,您需要修改a,这样一个常量值就不起作用了。

所以我们只是将值复制到另一个变量中,一个里面内部类。这使得一切正常,因为现在内部类有自己的变量可以使用。

【讨论】:

    最近更新 更多