【问题标题】:Local Variable Accessed from within - Java从内部访问的局部变量 - Java
【发布时间】:2013-09-23 22:00:30
【问题描述】:

我在 timer.stop() 中得到一个错误,它说“局部变量 timer 是从类中访问的;需要声明为 final”

public static void main(String args[]) {
    int tick; 
    Timer timer;


        timer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int tick=0;
                System.out.println("Success" + ++tick);
                if (tick > 4) {
                    timer.stop();
                }
            }
        });
        timer.setInitialDelay(0);







    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new NewJFrame().setVisible(true);
        }
    });
}

我试过这个:

public static void main(String args[]) {

    int tick; 
    Timer timer;


     final Timer timer = new Timer(1000, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        int tick=0;
        System.out.println("Success" + ++tick);
        if (tick > 4) {
            timer.stop(); //this refers to the final variable timer, this is valid.
        }
    }
          });
        timer.setInitialDelay(0);







    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new NewJFrame().setVisible(true);
        }
    });
}

现在错误出现在“final Timer timer = new Timer(1000, new ActionListener() {”该计时器已在 main(java.lang.String[]) 中定义 如果我删除 Timer 计时器;它在“timer.stop()”上显示变量计时器可能尚未初始化的错误

【问题讨论】:

  • ...问题是什么?
  • 我第一次阅读时文本不完整。它是在几分钟前编辑的。

标签: java variables timer local


【解决方案1】:

试试这个:

public static void main(String[] args) {
    class Listener implements ActionListener {
        int tick = 0;
        Timer timer = null;
        public void setTimer(Timer timer) {
            this.timer = timer;
        }
        public void actionPerformed(ActionEvent e) {
            tick++;
            if (tick > 4) {
                timer.stop();
            }
        }
    }
    Listener listener = new Listener();
    Timer timer = new Timer(1000, listener);
    listener.setTimer(timer);
    timer.setInitialDelay(0);
}

【讨论】:

  • 试试这个,你可以在actionlistener实现中添加一个setter。 Timer 和 ActionListener 相互依赖,因此您需要执行此解决方法。
  • 我听不懂你刚才说什么,你能解释一下吗...@U Mad
  • 首先尝试我给出的其他答案。那个更简单。
【解决方案2】:

另一种方式是这样的:

在 actionPerformed 中而不是 timer.stop()((Timer)e.getSource()).stop();

【讨论】:

    【解决方案3】:

    所以问题是你声明了 2 次计时器

    Timer timer;
    
    final Timer timer = new Timer(1000, new ActionListener() {
    ...
    

    只需删除该行:

    Timer timer;
    

    【讨论】:

    • 当我删除 Timer 计时器时;它在“timer.stop()”中显示错误,表明计时器可能尚未初始化@csoroiu
    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 2011-03-14
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多