public class ThreadHandler {
    private volatile static boolean  flag = false;
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{throw new NullPointerException();},"threadHandler");
        Thread.UncaughtExceptionHandler handler = (thread,e)->{
            flag = true;
            System.out.println("threadhandler:"+e);
        };
        t.setUncaughtExceptionHandler(handler);
        t.start();
        t.join();
        if(flag){
            System.out.println(true);
        }else {
            System.out.println(false);
        }
        System.out.println("===main===");
    }

}

输出:

threadhandler:java.lang.NullPointerException
true
===main===

可以看到,子线程报NPE异常,flag变为true,在main线程中可以打印出来,则子线程异常通知到主线程