堆栈跟踪如下:
c
b
a
main
假设c
是 throwing FileNotFoundException
。我将此异常传播到b
using throws
。我正在从b
toa
和 from a
to传播异常main
。
当我throws FileNotFoundException
在 main 中使用时,异常会传播到哪里?
因为我没有catch
在 main for 内部定义FileNotFoundException
,而只是throws
.
到 Java 运行时,它将打印堆栈跟踪并中止程序。
(我很好奇是什么导致了这个问题。你试过代码了吗?你在哪里被它的行为弄糊涂了?)
未捕获的异常最终将由UncaughtExceptionHandler
正在执行代码的线程处理。该类Thread
具有设置未捕获异常处理程序的方法。的文档Thread#setDefaultUncaughtExceptionHandler
解释了该过程:
未捕获的异常处理首先由线程控制,然后由线程的
ThreadGroup
对象控制,最后由默认的未捕获异常处理程序控制。如果线程没有明确的未捕获异常处理程序集,并且线程的线程组(包括父线程组)没有专门化其方法,则将调用uncaughtException
默认处理程序的方法。uncaughtException
通过设置默认的未捕获异常处理程序,应用程序可以更改那些已经接受系统提供的任何“默认”行为的线程处理未捕获异常的方式(例如记录到特定设备或文件)。
如果没有设置其他未捕获的异常处理程序,则 inThreadGroup
将异常的堆栈跟踪打印到System.err
.
规范似乎没有说明哪个线程应该执行未捕获的异常处理程序,但在 Oracle/OpenJDK JVM 上,它是即将终止的线程(即引发异常的线程)。
异常将由 JVM 处理 - 它打印堆栈跟踪并退出。这同样适用于在上升过程中没有被捕获的运行时异常。