线程在执行单元中是不允许抛出异常的,而线程在运行在自己的上下文中,派生他的线程将无法直接获得它运行中出现的异常信息。为此java提供了一个UncaughtExceptionHandler接口(是一个FunctionInterface函数式接口,只有一个方法dispatchUncaughtExceptionHandler())。
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