这是我第一次来这里。请原谅我的英语不好。
我在这里写信是想问一个关于TimerTask
对象处置及其附带影响的问题。
这是一个简单的例子。这个例子展示了一个JFrame
带有一个大按钮的 a ,它启动了一个TimerTask
。这个任务只写一条消息,休眠6秒,再写一条消息。
每 10 秒(这一事实并不重要)执行一次任务。
如果我单击按钮(当我知道任务已停止并处于 sleep 方法时),对象编写器(让我们编写消息)设置为 null 并取消计时器。
然后,如果我取消任务,并且该任务的执行正在运行,它可以被抛出NullPointerException
(记住 writer 设置为 null)。
我的问题是:在这种情况下我该如何避免NullPointerException
?在 Timertask 的 run 方法中捕获它?还是直接用中断方法中断任务?
感谢您的理解。
public class CancelTimer extends JFrame{
public static void main(String[] args) {
new CancelTimer().setVisible(true);
}
Timer timer;
Writer writer;
public CancelTimer() {
super();
writer=new Writer();
timer= new Timer("timer");
timer.schedule(new TimerTask() {
@Override
public void run() {
try{
writer.print("Start and wait");
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
writer.print("Bye, bye!");
} catch (NullPointerException e){
System.out.println("NullPointerException due external disposing task!");
}
}
}, 3000, 10000);
JPanel panel = new JPanel(new BorderLayout());
JButton button= new JButton();
button.setAction(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
writer=null;
timer.cancel();
}
});
panel.add(button,BorderLayout.CENTER);
this.setContentPane(panel);
this.pack();
this.setSize(new Dimension(400,400));
}
private class Writer {
public void print(String text){
System.out.println("PRINT SOME TEXT: "+text);
}
}
}