Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NullPointerException:Timertask取消和对象处理_Java_Swing_Nullpointerexception_Try Catch_Timertask - Fatal编程技术网

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,则计时器的线程停止并不执行任何操作。那么,以前的处置就没有问题了。谢谢你给我的回复!你有没有找到解决这个问题的好办法?我也经历了同样的事情。你有没有找到解决这个问题的优雅方法?我正在经历完全相同的事情。