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