接口
Thread.UncaughtExceptionHandler
1.概述
public static interface Thread.UncaughtExceptionHandler
当 Thread 因未捕获的异常而突然终止时,调用处理程序的接口。
当某一线程因未捕获的异常而即将终止时,Java 虚拟机将使用 Thread.getUncaughtExceptionHandler() 查询该线程以获得其 UncaughtExceptionHandler 的线程,并调用处理程序的 uncaughtException 方法,将线程和异常作为参数传递。如果某一线程没有明确设置其 UncaughtExceptionHandler,则将它的 ThreadGroup 对象作为其 UncaughtExceptionHandler。如果 ThreadGroup 对象对处理异常没有什么特殊要求,那么它可以将调用转发给默认的未捕获异常处理程序。
2.源码阅读:
public interface UncaughtExceptionHandler {
/**
* 当给定线程因给定的未捕获异常而终止时,调用该方法。
* Java Virtual Machine.
* @param t 线程
* @param e 异常
*/
void uncaughtException(Thread t, Throwable e);
}
3.用法
public class MyThreadUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t.getName()+"线程出线了异常:"+e);
e.printStackTrace();
}
}
public static void main(String[] args){
Thread.currentThread().setUncaughtExceptionHandler(new MyThreadUncaughtExceptionHandler());
int a =5/0;
System.out.println("异常正常结束");
}
输入:
main线程出线了异常:java.lang.ArithmeticException: / by zero
4.总结
使用try ..catch捕获异常时,异常不会向上传递给上一级调用者。
使用自定义uncaughtExceptionhandler会对于异常处理之后返回给上一级调用者,导致程序没有正常结束。