如何修复Java中与计时器有关的错误?

时间:2018-12-27 19:39:15

标签: java timer

我正在尝试编写一个计时器,该计时器将从10开始倒数​​,然后在到达0时停止,但在'timer.cancel();'中停止代码底部的“计时器”下方有一个红线。它说我还没有定义“计时器”。 我确实在代码的前面定义了“计时器”,所以我不确定自己做错了什么吗?

(我正在NetBeans 8.2中这样做)

package javaapplication3;
import java.util.Timer;
import java.util.TimerTask;

public class JavaApplication3 {
     public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new timeInterval(), 0, 1000);
    }
}

class timeInterval extends TimerTask {

    int countdown = 10;

    public void run() {
        countdown = countdown - 1;
        System.out.println(countdown);
        if (countdown <= 0) {
            timer.cancel();
    }

}
}

2 个答案:

答案 0 :(得分:0)

这是一个示波器问题。您不能在TimerTask类中引用命名的对象计时器,因为它不知道它。

可能会签出this article on scope of variables

您可以尝试仅调用cancel()函数。 You can read about the TimerTask java class here

if (countdown <= 0) {
  cancel();
}

除非您有充分的理由不这样做,否则还应该养成将类变量设为私有的习惯。

请注意,这不会杀死Timer对象,只会杀死为其计划的任务。如果您不打算再次使用它,则应在其中添加一些代码以取消它。

答案 1 :(得分:0)

这里的问题是timer超出范围。换句话说,它无法在public static void main(String[] args)之外看到。我建议您在Scope

上浏览此网页以获取更多信息

一个简单的解决方法是使用构造函数简单地传递计时器。参见下文,您如何称呼TimerInterval(timer)

注意

我重命名了您的类,使其符合标准的Java命名约定。参见Java Naming Conventions

import java.util.Timer;
import java.util.TimerTask;

public class JavaApplication3 {
     public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new TimeInterval(timer), 0, 1000);
    }
}

class TimeInterval extends TimerTask {
    private Timer t;
    public TimeInterval(Timer t) {
        this.t = t;
    }

    int countdown = 10;

    public void run() {
        countdown = countdown - 1;
        System.out.println(countdown);
        if (countdown <= 0) {
            t.cancel();
        }
    }
}