ホームページ >Java >&#&チュートリアル >Java のスレッドによってスローされたキャッチされない例外を処理する方法?
スレッドによってスローされた例外をキャッチする
Java では、新しいスレッドが作成されると、その run() メソッドがメインスレッドと同時に実行されます。糸。ただし、スレッド内でスローされた例外をメイン クラスで直接処理することはできません。
次のコードを考えてみましょう:
public class Test extends Thread { public static void main(String[] args) throws InterruptedException { Test t = new Test(); try { t.start(); t.join(); } catch(RuntimeException e) { System.out.println("** RuntimeException from main"); } System.out.println("Main stopped"); } @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 の使用
Thread.UncaughtExceptionHandler は、糸の中に引っかからない。これを使用するには、setUncaughtExceptionHandler() を使用してハンドラーをスレッドに割り当て、その 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();
この例では、コードを編集すると、ハンドラーはキャッチされなかった例外をコンソールに出力します。 Thread.UncaughtExceptionHandler を使用すると、スレッド内でスローされた例外をメイン クラスで効果的に処理できます。
以上がJava のスレッドによってスローされたキャッチされない例外を処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。