NullPointerException: Timertask Cancel и удаление объекта - PullRequest
1 голос
/ 21 декабря 2011

Это мой первый раз здесь.Пожалуйста, извините за мой плохой английский.

Я пишу здесь, чтобы задать вопрос о TimerTask и побочных эффектах утилизации объектов.

Вот простой пример.Этот пример показывает JFrame с большой кнопкой, которая запускает TimerTask.Эта задача только пишет сообщение, спит 6 секунд и пишет другое сообщение.

Каждые 10 секунд (это не важно, этот факт) задача выполняется.

Если я нажимаю кнопку (когдаЯ знаю, что задача остановлена ​​и в спящем методе) объект записи (который позволяет нам писать сообщение) устанавливается в ноль, а таймер отменяется.

Затем, если я отменю задачу, ивыполнение этой задачи выполняется, ее можно выбросить NullPointerException (помните, что для записи было установлено значение 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);
        }

    }


}

1 Ответ

1 голос
/ 21 декабря 2011

Если вы не установили значение writer в ноль, а вместо этого использовали значение boolean, чтобы отслеживать, активна ли ваша задача или нет, вы можете избавиться от необходимости ловить NullPointerException. * 1004. *

По сути, отследите, должны ли вы писать что-то другим или нет. Установка writer на null просто глупо, потому что, как вы заметили, это требует от вас перехвата и обработки исключения. Это не для чего существуют исключения.

...