使用throws将Exception传播到被调用的方法

时间:2013-08-28 09:21:21

标签: java exception

堆栈跟踪如下:

c
b
a
main

假设c正在投掷FileNotFoundException。我使用b将此异常传播到throws。我正在将例外从b传播到a,从a传播到main

当我在main中使用throws FileNotFoundException时,异常将在哪里传播?

因为我没有在catch的主内部定义FileNotFoundException,而只定义throws

3 个答案:

答案 0 :(得分:3)

到Java运行时,它将打印堆栈跟踪并中止程序。

(我很好奇是什么导致了这个问题。你试过代码吗?你对它的行为感到困惑吗?)

答案 1 :(得分:3)

未捕获的异常最终将由执行代码的线程的UncaughtExceptionHandler处理。 Thread类具有为未捕获的异常设置处理程序的方法。 Thread#setDefaultUncaughtExceptionHandler的文档解释了该过程:

  

未捕获的异常处理首先由线程控制,然后由线程的ThreadGroup对象控制,最后由默认的未捕获异常处理程序控制。如果线程没有明确的未捕获异常处理程序集,并且线程的线程组(包括父线程组)不专门化其uncaughtException方法,则将调用默认处理程序的uncaughtException方法。 / p>      

通过设置默认的未捕获异常处理程序,应用程序可以更改已经接受系统提供的任何“默认”行为的线程处理未捕获异常的方式(例如,记录到特定设备或文件) 。

如果未设置其他未捕获的异常处理程序,ThreadGroup中的异常处理程序会将异常的堆栈跟踪打印到System.err

规范似乎没有说哪个线程应该执行未捕获的异常处理程序,但是在Oracle / OpenJDK JVM上,它是即将终止的线程(即抛出异常的线程)。

答案 2 :(得分:2)

异常将由JVM处理 - 它打印堆栈跟踪并退出。这同样适用于未在某个地方被捕获的运行时异常。