1

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.htmlに記載されているように、JVMがfinally()を呼び出さないケースを特定するサンプルプログラムを作成しようとしていました。


注: try または catch コードの実行中に JVM が終了すると、finally ブロックが実行されない場合があります。同様に、try または catch コードを実行しているスレッドが中断または強制終了された場合、アプリケーション全体が続行されても、finally ブロックが実行されない可能性があります。


しかし、私が書いたすべてのケースで、finally が呼び出されています ( and のthread.suspend()ないケースを除く)。他のさまざまなフォーラムで言及されているのとは対照的に、最終的にも呼び出されます (以下のコード スニペット)。thread.resume()System.exit()thread.stop()

誰でも助けることができますか?ありがとう。

try {
    final Thread thread = Thread.currentThread();
    new Thread(new Runnable() {
        @Override
        @SuppressWarnings(value = "deprecation")
        public void run() {
            thread.stop();
            // thread.suspend();
        }
    }).start();
    while (true)
        Thread.sleep(1000);
} finally {
    System.out.print("finally called after stop");
}
4

2 に答える 2

1

のjavadocからThread.stop

このスレッドによって表されるスレッドは、異常な動作を強制的に停止し、新しく作成された ThreadDeath オブジェクトを例外としてスローします。

したがって、このメソッドは実際に をスローするExceptionため、finally引き続き呼び出されます。

于 2013-09-26T18:30:03.810 に答える
0

@Borisを補完する

javadoc から:

アプリケーションは、特別なクリーンアップ操作を行う必要がない限り、通常、ThreadDeath をキャッチしようとするべきではありません(ThreadDeath をスローすると、スレッドが正式に終了する前に、try ステートメントの finally 句が実行されることに注意してください)。catch 句が ThreadDeath オブジェクトをキャッチする場合、スレッドが実際に終了するようにオブジェクトを再スローすることが重要です。

于 2013-09-26T18:39:30.003 に答える