回答
因为在 try-catch 中是无法捕获到子线程抛出的异常。主要原因是因为,每个线程都有自己独立的堆栈空间和执行上下文。由于它是独立的,所以当一个线程抛出异常后,这个异常只会沿着该线程的调用栈向上传播,它不会自动传播到启动它的主线程上去 ,所以也就不会被主线程的 try-catch
捕获。
那子线程抛了异常要怎么处理呢?目前主流的处理方法有四个:
- 子线程自己捕获异常,自己处理。这是一种最直接的方式。
- 使用
Thread.UncaughtExceptionHandler
:UncaughtExceptionHandler
是 Thread 的一个内部函数式接口,它用于处理由于线程抛出的未捕获异常而导致线程突然终止的情况。当线程中的方法由于未捕获的异常而终止时,JVM 会检查该线程是否有其自己的 UncaughtExceptionHandler,如果有,则执行。 - 使用
Future
和ExecutorService
。 - 使用
afterExecute()
关于这四种方案详细情况可以阅读这篇文章:线程池中的线程出现了异常要怎么处理?