Java 线程和异常?

mzo*_*zoz 1 java multithreading

我正在学习 Java线程教程,无法理解最后一个问题“线程和异常”的解释:

\n\n
\n

现在假设我们运行这个测试:

\n\n
@Test public void testThreadOops() {\n  new Thread(() -> { throw new Error("thread oops"); }).start();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

是否打印堆栈跟踪Error: thread oops?( ) 是 ( ) 否

\n\n

测试: ( ) 通过 ( ) 失败

\n
\n\n

这个问题的解释是:

\n\n
\n

错误发生在新创建的线程上,并通过控制台上的堆栈跟踪终止该线程。但测试方法testThreadOops正常返回 \xe2\x80\x93 主线程 \xe2\x80\x93 上没有异常并且 JUnit 测试通过。它不会检测到 oops。

\n
\n\n

为什么主线程没有异常呢?

\n

Ste*_*n C 5

是否打印了 Error: thread oops 的堆栈跟踪?

这取决于。

子线程(即不是“主”线程)上的未捕获异常将被传递到该线程的未捕获异常处理程序、线程组未捕获异常处理程序或默认未捕获异常处理程序。这些通常负责打印堆栈跟踪。

如果您(或您的框架)没有设置处理程序,则默认行为是不执行任何操作,并且任何地方都不会出现堆栈记录。

(设置处理程序的方法在 javadoc 中进行了描述Thread。)

为什么主线程没有异常呢?

因为异常不是在主线程上抛出的。它被抛出......并且必须在子线程的堆栈上捕获/处理......。

这样想吧。如果子线程上的异常以某种方式在父线程上重新引发,您会在哪里捕获它?你会如何处理?如果它是一个已检查的异常,并且上下文不允许抛出该特定异常怎么办?