1. ホーム
  2. java

[解決済み] スレッドからExceptionをキャッチする方法

2022-04-13 05:30:10

質問

私はJavaのメインクラスを持っています、私はクラスで、新しいスレッドを開始し、メインでは、スレッドが死ぬまで待機します。ある瞬間、私はスレッドから実行時例外をスローしますが、私はメインクラスでスレッドからスローされた例外をキャッチすることができません。

以下はそのコードです。

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 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)
    {

    }
  }
}

どなたか理由をご存じですか?

解決方法は?

を使用します。 Thread.UncaughtExceptionHandler .

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();