ホームページ >Java >&#&チュートリアル >Java で子スレッドからスローされた例外を処理するにはどうすればよいですか?
スレッドからスローされた例外の処理
マルチスレッド アプリケーションでは、メイン スレッドの子スレッドによってスローされた例外を処理することが不可欠です。次のシナリオを考えてみましょう。
<br>public class Test extends Thread {<br> public static void main(String[] args) throws InterruptedException {</p> <pre class="brush:php;toolbar:false">Test t = new Test(); try { t.start(); t.join(); } catch (RuntimeException e) { System.out.println("** RuntimeException from main"); } System.out.println("Main stoped");
}
@Override
public void run() {
try { while (true) { System.out.println("** Started"); sleep(2000); throw new RuntimeException("exception from thread"); } } catch (RuntimeException e) { System.out.println("** RuntimeException from thread"); throw e; } catch (InterruptedException e) { }
}
}
この例では、子スレッドでスローされた例外はメイン スレッドに伝播しません。これは、Java がスレッドでスローされた例外をメイン スレッドのハンドラーに自動的に関連付けないためです。
解決策: Thread.UncaughtExceptionHandler
スレッドからの例外を処理するには、 Thread.UncaughtExceptionHandler を使用できます。このインターフェイスは、スレッドでキャッチされない例外が発生したときに呼び出されるメソッド uncaughtException() を提供します。
Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread th, Throwable ex) { System.out.println("Uncaught exception: " + ex); } }; Thread t = new Thread() { @Override public void run() { System.out.println("Sleeping ..."); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Interrupted."); } System.out.println("Throwing exception ..."); throw new RuntimeException(); } }; t.setUncaughtExceptionHandler(h); t.start();
スレッドに uncaughtExceptionHandler を設定することにより、キャッチされない例外は提供された実装によって処理されます。これにより、メインスレッドが例外を適切にキャプチャして処理できるようになり、適切な処理とエラー報告が保証されます。
以上がJava で子スレッドからスローされた例外を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。