1

这是我第一次来这里。请原谅我的英语不好。

我在这里写信是想问一个关于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);
        }

    }


}
4

1 回答 1

1

如果您不将您设置writer为 null,而是使用一个boolean值来跟踪您的任务是否处于活动状态,则可以省去必须捕获NullPointerException.

基本上,跟踪您是否应该以其他方式编写内容的状态。将您设置writernull只是愚蠢的,因为正如您所注意到的,它需要您捕获并处理异常。这不是例外。

于 2011-12-21T17:11:53.193 回答