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