我正在尝试编写一个计时器,该计时器将从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();
}
}
}
答案 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();
}
}
}