当一个线程抛出异常时会发生什么?

12
如果我在一个线程上调用了run()方法,而run()方法抛出了一个未捕获的异常,那么会发生什么情况?
谁来捕获这个异常?这个异常是否会被捕获?

7
为了更加清晰明了,你不需要调用run()方法,而是需要在Thread上调用start()方法,这样run()方法中的代码就会在一个新线程中运行。直接调用run()方法只会使得run方法在当前线程中执行。 - Nate
3个回答

10
如果为ThreadGroup安装了异常处理程序,JVM将把异常传递给它。如果是AWT线程,您可以为未处理的异常安装事件处理程序。否则,JVM会处理它。
以下是具有自定义处理程序的线程组示例以及如何使用它:
public class MyThreadGroup extends ThreadGroup {
    public MyThreadGroup() {
        super("My Thread Group");
    }
    public void uncaughtException(Thread t, Throwable ex) {
        // Handle exception
    }
}

Thread t = new Thread(new MyThreadGroup(), "My Thread") { ... };
t.start();

使用AWT异常处理程序的示例:

public class MyExceptionHandler {
    public void handle(Throwable ex) {
        // Handle exception
    }
    public void handle(Thread t, Throwable ex) {
        // Handle exception
    }
}

System.setProperty("sun.awt.exception.handler", MyExceptionHandler.class.getName());

10
否则 JVM 会处理它,更准确地说,引发异常的线程将会默默地终止。 - Stephen C
1
@Stephen:实际上它会将异常打印到stderr。 - Draemon
真的吗?那一定是与JVM有关,因为我曾因缺少堆栈跟踪而被绊倒。 - Stephen C
当然,这将是实现定义。我并不建议任何人依赖它。我只是想说,处理未处理的异常取决于JVM要做什么。 - Draemon

1

如果您已将Runnable提交给ExecutorService,则可以通过ExecutionException中包装的方式捕获异常。(强烈建议使用此方法而不是简单地调用run())


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接