これは初めてのことです。私の悪い英語を許してください。NullPointerException:Timertaskキャンセルとオブジェクトの廃棄
私はここに書いて、TimerTask
とオブジェクトの処分の副作用について質問しています。
ここは簡単な例です。この例では、TimerTask
を開始する大きなボタンのJFrame
が表示されています。このタスクはメッセージを書き込むだけで、6秒間スリープして別のメッセージを書き込みます。
10秒ごと(これは重要ではない)、タスクが実行されます。
ボタンをクリックすると(タスクが停止しスリープメソッドであることがわかっている場合)、オブジェクトライター(メッセージを書き込もうとします)がnullに設定され、タイマーがキャンセルされます。
次に、タスクをキャンセルしてこのタスクの実行が実行されている場合は、NullPointerException
(ライターがnullに設定されていることに注意してください)をスローすることができます。
私の質問は:どうすればこの場合はNullPointerException
を避けることができますか?それをTimerの 実行メソッドでキャッチしますか?または割り込み方法でタスクを直接中断しますか?
ご理解いただきありがとうございます。
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);
}
}
}
この問題に対する優雅な解決策を見つけたことはありますか?私はまったく同じことを経験しています。 – stackoverflowuser2010