线程在执行单元中是不允许抛出异常的,而线程在运行在自己的上下文中,派生他的线程将无法直接获得它运行中出现的异常信息。为此java提供了一个UncaughtExceptionHandler接口(是一个FunctionInterface函数式接口,只有一个方法dispatchUncaughtExceptionHandler())。
关于异常处理的四个API
Thread类中关于UncaughtExceptionHandler的四个api:
public void setUncaughtExceptionHandler(UncaughtException eh);
为某个特定线程指定UncaughtExceptionHandler。
public static void setDefaultUncaughtExceptionHandler(UncaughtException eh);
设置全局的UncaughtExceptionHandler。
public UncaughtExceptionHandler getUncaughtExceptionHandler();
获取特定线程的UncaughtExceptionHandler
public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler();
获取全局的UncaughtExceptionHandler。
package day0518;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
/**
* @author liw
* @date 2020-06-16
*/
public class Demo1 {
public static void main(String[] args) throws InterruptedException {
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
System.out.println(t.getName() + "发生了异常");
e.printStackTrace();
});
Thread thread = new Thread(()->{
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(1/0);
},"ThreadTest") ;
thread.start();
}
}
执行结果:
ThreadTest发生了异常
java.lang.ArithmeticException: / by zero
at day0518.Demo1.lambda$main$1(Demo1.java:27)
at java.lang.Thread.run(Thread.java:748)
Process finished with exit code 0