Java NullPointerException:Timertask取消和对象处理
这是我第一次来这里。请原谅我英语不好 我在这里写信是想问一个关于Java NullPointerException:Timertask取消和对象处理,java,swing,nullpointerexception,try-catch,timertask,Java,Swing,Nullpointerexception,Try Catch,Timertask,这是我第一次来这里。请原谅我英语不好 我在这里写信是想问一个关于TimerTask和物体处理的附带影响的问题 下面是一个简单的例子。此示例显示了带有一个大按钮的JFrame,该按钮启动TimerTask。此任务仅写入一条消息,休眠6秒,然后写入另一条消息 每10秒(这一事实并不重要)执行一次任务 如果我单击该按钮(当我知道任务已停止且处于睡眠方法中时),对象编写器(让我们编写消息)将设置为null,并且计时器将取消 然后,如果我取消该任务,并且正在运行该任务的执行,则可以抛出它NullPoint
TimerTask
和物体处理的附带影响的问题
下面是一个简单的例子。此示例显示了带有一个大按钮的JFrame
,该按钮启动TimerTask
。此任务仅写入一条消息,休眠6秒,然后写入另一条消息
每10秒(这一事实并不重要)执行一次任务
如果我单击该按钮(当我知道任务已停止且处于睡眠方法中时),对象编写器(让我们编写消息)将设置为null,并且计时器将取消
然后,如果我取消该任务,并且正在运行该任务的执行,则可以抛出它NullPointerException
(记住writer被设置为null)
我的问题是:在这种情况下,如何避免NullPointerException
?在空中接住它
Timertask的运行方法?或者直接用中断方法中断任务
谢谢你的理解
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);
}
}
}
如果您没有将
编写器
设置为null,而是使用布尔值
跟踪任务是否处于活动状态,则可以省去捕获NullPointerException
的麻烦
基本上,跟踪你是否应该以其他方式写东西的状态。将
writer
设置为null
非常愚蠢,因为正如您所注意到的,它需要您捕获并处理异常。这不是异常的用途。如果不将编写器设置为null,而是使用布尔值来跟踪任务是否处于活动状态,则可以省去捕获NullPointerException
的麻烦
基本上,跟踪你是否应该以其他方式写东西的状态。将writer
设置为null
非常愚蠢,因为正如您所注意到的,它需要您捕获并处理异常。这不是例外情况。我同意你的观点,但我认为我的解释不清楚。假设在任务中,您正在从其他类获取其他源或其他对象的信息。如果这些源中的一些被释放,当您取消任务时,您可能会发现一个NullPointerException,因为这些资源可以设置为null。假设您正在表单中绘制某个内容,并且包含该内容的窗口被处理并设置为null。好吧,这是一个很好的理论情况,但这是真的发生了吗,或者您正在谈论可能发生的事情,但实际上没有发生?如果你不是在谈论一个实际发生的问题,我不能帮你“想象一下…”,所以我们可以谈论具体的问题。好吧,我在思考我的问题,最后,TimerTask没有问题。如果timertask抛出NullPointerException,则计时器的线程停止并不执行任何操作。那么,以前的处置就没有问题了。谢谢你给我的回复!我同意你的看法,但我认为我的解释不清楚。假设在任务中,您正在从其他类获取其他源或其他对象的信息。如果这些源中的一些被释放,当您取消任务时,您可能会发现一个NullPointerException,因为这些资源可以设置为null。假设您正在表单中绘制某个内容,并且包含该内容的窗口被处理并设置为null。好吧,这是一个很好的理论情况,但这是真的发生了吗,或者您正在谈论可能发生的事情,但实际上没有发生?如果你不是在谈论一个实际发生的问题,我不能帮你“想象一下…”,所以我们可以谈论具体的问题。好吧,我在思考我的问题,最后,TimerTask没有问题。如果timertask抛出NullPointerException,则计时器的线程停止并不执行任何操作。那么,以前的处置就没有问题了。谢谢你给我的回复!你有没有找到解决这个问题的好办法?我也经历了同样的事情。你有没有找到解决这个问题的优雅方法?我正在经历完全相同的事情。