Cen*_*Can 2 java exception-handling exception try-catch nullpointerexception
我在学习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 ");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我完全知道finally块总是执行,除非有一个System.exit(),所以我跟踪了程序,并确定它将有一个像这样的输出
线程"main"中的两个异常java.lang.NullPointerException线程"main"中的三个异常java.lang.NullPointerException四
但是,事实证明输出正确(根据网站和Eclipse调试)
线程"main"java.lang.NullPointerException中的一个二三四异常
我不理解的是,在带有"两个"的catch块中发生的异常在哪里去了?
在它下面没有捕获块,它不应该被主线程抛出吗?因为它没有被捕获?
该异常实际上已丢失 - 如果finally块抛出异常,则在传播过程中的任何异常都变得无关紧要,并且finally块的结果是新的异常.
同样,如果你返回 finally块,那么整个try/catch/finally将永远不会抛出异常.
有关详细信息,请参阅Java语言规范的第14.20.2节.特别是,像这样的各种位:
如果finally块因任何原因突然完成,则try语句突然完成,原因相同.