2024-08-04
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/2089754424

回答

因为在 try-catch 中是无法捕获到子线程抛出的异常。主要原因是因为,每个线程都有自己独立的堆栈空间和执行上下文。由于它是独立的,所以当一个线程抛出异常后,这个异常只会沿着该线程的调用栈向上传播,它不会自动传播到启动它的主线程上去 ,所以也就不会被主线程的 try-catch 捕获。

那子线程抛了异常要怎么处理呢?目前主流的处理方法有四个:

  1. 子线程自己捕获异常,自己处理。这是一种最直接的方式。
  2. 使用 Thread.UncaughtExceptionHandlerUncaughtExceptionHandler 是 Thread 的一个内部函数式接口,它用于处理由于线程抛出的未捕获异常而导致线程突然终止的情况。当线程中的方法由于未捕获的异常而终止时,JVM 会检查该线程是否有其自己的 UncaughtExceptionHandler,如果有,则执行。
  3. 使用 FutureExecutorService
  4. 使用 afterExecute()

关于这四种方案详细情况可以阅读这篇文章:线程池中的线程出现了异常要怎么处理?