繁体   English   中英

从内部访问局部变量-Java

[英]Local Variable Accessed from within - Java

我在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);
        }
    });
}

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

尝试这个:

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);
}

另一种方法是这样的:

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

所以问题是您声明定时器2次

Timer timer;

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

只需删除该行:

Timer timer;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM