2011-12-21 9 views
1

これは初めてのことです。私の悪い英語を許してください。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); 
     } 

    } 


} 
+0

この問題に対する優雅な解決策を見つけたことはありますか?私はまったく同じことを経験しています。 – stackoverflowuser2010

答えて

1

あなたはnullにごwriterを設定し、その代わりに、あなたはNullPointerExceptionをキャッチする手間を節約することができ、あなたのタスクがアクティブであるかどうかを追跡するboolean値を使用しない場合。

基本的に、何か他の方法で何かを書くべきかどうかの状態を追跡します。 writernullに設定することは、あなたが気づいたように、例外を捕まえて処理する必要があるため、ばかげているだけです。これは、ではなく、の例外です。

+0

私はあなたに同意しますが、私の説明は明らかではないと思います。タスクでは、他のクラスのソースや他のオブジェクトの情報を取得しているとします。これらのソースの一部が破棄されている場合、タスクをキャンセルすると、これらのリソースをnullに設定できるため、NullPointerExceptionが見つかることがあります。あなたがフォームに何かを描いており、それを含むウィンドウが破棄されnullに設定されているとします。 – javer

+0

これは素晴らしい理論的状況ですが、実際に起こっているのでしょうか?**起こっているかもしれないことについて話していますか?実際にはありませんか?実際に起こっている実際の問題について話していないのであれば、私はあなたに「想像してください...」とお手伝いすることはできません。 – jefflunt

+0

まあ、私は私の質問についてもっと考えていたし、最後に、TimerTaskに問題はありません。 timertaskがNullPointerExceptionをスローすると、Timerのスレッドは停止し、何もしません。その後、以前の処分に問題はありません。 ありがとうございます。 – javer

関連する問題