2016-05-14 7 views
-1

私は単純なJavaアプリケーションを開発中です。私は例外を投げることに問題があります。スレッド内でのエラー(例外)のスロー

実際には、例外はスレッドでスローする必要があります。したがって、これらの例外はどこにあるスレッドがありますか?

public void setVyplata(Otec otec) { 

    try { 
     otec.setVyplata(Integer.parseInt(textField1.getText())); 

    } catch (NumberFormatException e) { 
     JOptionPane.showMessageDialog(panel, "Nemozno vlozit string", "Error", JOptionPane.ERROR_MESSAGE); 
     otec.setVyplata(0); 
     textField1.setText("0"); 
    } 

} 

public void setVyplata(Mama mama) { 

    try { 
     mama.setVyplata(Integer.parseInt(textField2.getText())); 

    } catch (NumberFormatException e) { 

     JOptionPane.showMessageDialog(panel, "Nemozno vlozit string", "Error", JOptionPane.ERROR_MESSAGE); 
     mama.setVyplata(0); 
     textField2.setText("0"); 
    } 
} 

両方の例外が同時にスローされる可能性があります。

そして、それがないとき、これは私が得るものです:

empty error message.... and my application stop working. i must close it trough task manager.

私は、各メソッドの実行中のスレッドを持っています。そして、私の質問は、なぜプログラムがここで動作しなくなるのかということです。なぜなら、私はこれらのスレッドのひとつを別々に起動するからです。それは完全に動作します。両方のスレッドを開始すると2つのエラーウィンドウが表示されますが、空白のエラーウィンドウとプログラムが動作していないことがわかります。

+3

ご質問はありますか? – Vijay

+0

メソッドごとにスレッドが動作していて、このExceptionをどこかに取得する必要があるのか​​、それとも2つのダイアログがあるかどうかを知る必要があるということですか?または、両方のスレッドが実行されているときに、同じダイアログで両方のエラーを実際に捕まえたいと思っていますか? –

+0

プログラムの実行を中断しないように例外をキャッチするので、そのメソッドの実行を中断する例外をキャッチすると、2つの異なるメソッドがあるため、2つの異なる例外がキャッチされます –

答えて

1

私は間違いなく、スレッドセーフでない問題のスイングコンポーネントに問題があるという前のコメントに基づいて言えます。 The Event Dispatch Threadのドキュメントをお読みください。 invokeメソッドを使用して、変更タスクをイベントディスパッチスレッドに配置する必要があります。それ以外の場合は、アプリケーションがクラッシュします。

あなたのコードの例:

public void setVyplata(Otec otec) { 

    try { 
     otec.setVyplata(Integer.parseInt(textField1.getText())); 

    } catch (NumberFormatException e) { 

     SwingUtilities.invokeLater(() -> { 
      JOptionPane.showMessageDialog(panel, "Nemozno vlozit string", "Error", JOptionPane.ERROR_MESSAGE); 
      otec.setVyplata(0); 
      textField1.setText("0"); 
     }); 

    } 

} 

public void setVyplata(Mama mama) { 

    try { 
     mama.setVyplata(Integer.parseInt(textField2.getText())); 

    } catch (NumberFormatException e) { 

     SwingUtilities.invokeLater(() -> { 
      JOptionPane.showMessageDialog(panel, "Nemozno vlozit string", "Error", JOptionPane.ERROR_MESSAGE); 
      mama.setVyplata(0); 
      textField2.setText("0"); 
     }); 
    } 
} 

あなたはSwingUtilitiesのドキュメントを見ると、あなたがinvokeLaterが実際に何をしているかの非常に良い説明があります。doRun.run()に原因

をAWTイベント ディスパッチスレッドで非同期に実行されます。これは、保留中のすべてのAWTイベントが処理された後に発生します。 このメソッドは、アプリケーションスレッド がGUIを更新する必要がある場合に使用する必要があります。次の例では、invokeLaterコール は、イベントディスパッチ スレッドでRunnableオブジェクトdoHelloWorldをキューに入れ、メッセージを出力します。

+2

ありがとうございました:)これは私の一日を救った:) –

関連する問題