gpt4 book ai didi

java - 为什么 main 方法不会捕获 catch block 中未捕获的异常

转载 作者:行者123 更新时间:2023-12-03 07:11:10 26 4
gpt4 key购买 nike

我在学习 OCPJP 认证模拟考试时想到了这个例子,
(来自 http://www.certpal.com 版本 1.6 考试第 3 部分,流程控制,问题编号 8)

public class Oak 
{
public static void main(String args[])
{
try
{
Integer i =null;
i.toString();
}
catch (Exception e)
{
try
{
System.out.println("One ");
Integer i =null;
i.toString();
}
catch (Exception x)
{
System.out.println("Two ");
Integer i =null;
i.toString();
}
finally
{
System.out.println("Three ");
Integer i =null;
i.toString();
}
}
finally
{
System.out.println("Four ");
}
}
}

我完全意识到finally block 总是执行,除非有System.exit(),所以我跟踪了程序并决定它将有这样的输出

One Two Exception in thread "main" java.lang.NullPointerException Three Exception in thread "main" java.lang.NullPointerException Four

然而,事实证明正确的输出是(根据现场和Eclipse调试)

One Two Three Four Exception in thread "main" java.lang.NullPointerException

我不明白的是,带有“Two”的 catch block 中发生的异常去了哪里?

下面没有catch block ,难道它不应该被主线程抛出吗?因为它没有被捕获?

最佳答案

该异常实际上已丢失 - 如果finally block 抛出异常,则传播过程中的任何异常都变得无关紧要,并且finally block 的结果是新的异常。

同样,如果您在finally block 中返回,那么整个try/catch/finally将永远不会抛出异常。

参见section 14.20.2 of the Java Language Specification了解详情。特别是,像这样的各种位:

If the finally block completes abruptly for any reason, then the try statement completes abruptly for the same reason.

关于java - 为什么 main 方法不会捕获 catch block 中未捕获的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7794781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com