0

複数のスレッドをネストすることで、try catch ブロックをバイパスすることができました。

try catch ブロックが例外によってバイパスされる場合、文書化されているルールはありますか?

try{
  Runnable r = new Runnable() {

    @Override
    public void run() {
      System.out.println("Thread");

      Display.getDefault().syncExec(new Runnable() {
        @Override
        public void run() {
          System.out.println("ThreadGUI");
          throw new NullPointerException();
        }
      });

    }
  };

  Thread t = new Thread(r);
  t.start();

} catch(NullPointerException e) {
  //nothing
}

System.out.println("Ende");
4

2 に答える 2

4

例外は、スレッド境界を越えて自動的に伝播しません。特定のスレッドで例外をスローした場合、そのスレッドでしかキャッチできません。コードの字句構造は、この点で違いはありません。

JLSの関連部分は次のとおりです。

例外をスローするプロセス中に、Java 仮想マシンは、現在のスレッドで実行を開始したが完了していない式、ステートメント、メソッドとコンストラクターの呼び出し、初期化子、およびフィールド初期化式を 1 つずつ突然完了します。このプロセスは、例外のクラスまたは例外のクラスのスーパークラスに名前を付けることによって、その特定の例外を処理することを示すハンドラーが見つかるまで続きます (§11.2)。そのようなハンドラーが見つからない場合、その例外は、キャッチされていない例外ハンドラーの階層の 1 つによって処理される可能性があります (§11.3)。

...

catch例外を処理できる句が見つからない場合、現在のスレッド (例外が発生したスレッド) は終了します。

于 2012-11-27T17:31:42.977 に答える
0

あなたの例外は別のスレッドでスローされます。これが引っかからない理由です。新しいスレッド内でそれをキャッチし、何らかの方法でメインスレッドに伝播したい場合があります。

于 2012-11-27T17:31:55.037 に答える