在java多线程程序中所有线程都不允许抛出未捕获的checked exception也就是说各个线程需要自己把自己的checked exception处理掉这一点是通过javalangRunnablerun()方法声明(因为此方法声明上没有throw exception部分)进行了约束但是线程依然有可能抛出unchecked exception当此类异常跑抛出时线程就会终结而对于主线程和其他线程完全不受影响且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常)JVM的这种设计源自于这样一种理念线程是独立执行的代码片断线程的问题应该由线程自己来解决而不要委托到外部基于这样的设计理念在Java中线程方法的异常(无论是checked还是unchecked exception)都应该在线程代码边界之内(run方法内)进行try catch并处理掉
但如果线程确实没有自己try catch某个unchecked exception而我们又想在线程代码边界之外(run方法之外)来捕获和处理这个异常的话java为我们提供了一种线程内发生异常时能够在线程代码边界之外处理异常的回调机制即Thread对象提供的setUncaughtExceptionHandler(ThreadUncaughtExceptionHandler eh)方法
通过该方法给某个thread设置一个UncaughtExceptionHandler可以确保在该线程出现异常时能通过回调UncaughtExceptionHandler接口的public void uncaughtException(Thread t Throwable e) 方法来处理异常这样的好处或者说目的是可以在线程代码边界之外(Thread的run()方法之外)有一个地方能处理未捕获异常但是要特别明确的是虽然是在回调方法中处理异常但这个回调方法在执行时依然还在抛出异常的这个线程中!
比之上述方法还有一种编程上的处理方式可以借鑒即有时候主线程的调用方可能只是想知道子线程执行过程中发生过哪些异常而不一定会处理或是立即处理那么发起子线程的方法可以把子线程抛出的异常实例收集起来作为一个Exception的List返回给调用方由调用方来根据异常情况决定如何应对不过要特别注意的是此时子线程早以终结