ホームページ >Java >&#&チュートリアル >Java のスレッドによってスローされたキャッチされない例外を処理する方法?

Java のスレッドによってスローされたキャッチされない例外を処理する方法?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-03 09:52:10980ブラウズ

How to Handle Uncaught Exceptions Thrown by Threads in 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。