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

Java 当线程抛出异常时会发生什么?,java,multithreading,Java,Multithreading,如果我在线程上调用run()方法,而run()方法抛出一个未捕获的异常,结果会是什么 谁抓住了这个例外?异常是否会被捕获?如果将其分配给实现该方法的服务器,则会捕获异常。如果为线程组安装了异常处理程序,JVM会将异常传递给它。如果是AWT线程,则可以为其他未处理的异常安装事件处理程序。否则JVM将处理它 具有自定义处理程序的线程组示例以及如何使用它: public class MyThreadGroup extends ThreadGroup { public MyThreadGroup

如果我在线程上调用
run()
方法,而
run()
方法抛出一个未捕获的异常,结果会是什么


谁抓住了这个例外?异常是否会被捕获?

如果将其分配给实现该方法的服务器,则会捕获异常。

如果为线程组安装了异常处理程序,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());

如果已将Runnable提交给,则可以捕获包装在中的异常。(强烈建议不要简单地调用run())

为了更清楚地说明这一点,您不需要调用run(),而是在线程上调用start(),以使run()方法中的代码在新线程中运行。直接调用run()只会使run方法在当前线程中执行。“否则JVM会处理它。”更准确地说,引发异常的线程将自动终止。@Stephen:实际上它会将异常打印到stderr。真的吗?它必须是特定于JVM的,然后。。。因为我被堆栈跟踪的缺失绊倒了。当然,它将由实现定义。我不是说有人会依赖它。我的意思是由JVM决定如何处理未处理的异常。