Это мой первый раз здесь.Пожалуйста, извините за мой плохой английский.
Я пишу здесь, чтобы задать вопрос о 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);
}
}
}