为什么main方法不会从catch块中捕获未捕获的异常

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块中发生的异常在哪里去了?

在它下面没有捕获块,它不应该被主线程抛出吗?因为它没有被捕获?

Jon*_*eet 7

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

同样,如果你返回 finally块,那么整个try/catch/finally将永远不会抛出异常.

有关详细信息,请参阅Java语言规范的第14.20.2节.特别是,像这样的各种位:

如果finally块因任何原因突然完成,则try语句突然完成,原因相同.