首页 >Java >java教程 >Java中如何处理线程抛出的未捕获异常?

Java中如何处理线程抛出的未捕获异常?

Susan Sarandon
Susan Sarandon原创
2024-12-03 09:52:10985浏览

How to Handle Uncaught Exceptions Thrown by Threads in Java?

捕获线程抛出的异常

在 Java 中,当创建一个新线程时,它会与 main 并发执行 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn