2

我用这个例子想出了边学习边模拟考试OCPJP认证,
(从http://www.certpal.com 1.6版考试部分3,流量控制,题号8)为什么不会的主要方法捕获从catch块uncatched例外

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块总是执行,除非有一个System.exit()的,所以我跟踪的方案,并决定这将有像线程这

一两个异常输出“main”java.lang.NullPointerExceptio ñ三个异常线程“main”显示java.lang.NullPointerException四

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

一二三四异常的线程“主”java.lang.NullPointerException

我不明白的是,在哪里发生的catch块与“两个”的异常去?

下面没有catch块,它不应该被主线程抛出吗?因为它没有抓住?

回答

6

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

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

有关详细信息,请参见section 14.20.2 of the Java Language Specification。特别是,像这样的各种位:

如果finally块由于任何原因突然完成,则try语句由于同样的原因突然完成。

+0

好的,我现在试图理解你的复杂解释:)你可以把它放在一个小的片段? –

+0

@CengizCan:那么你已经得到*代码,它显示了一切......如果抛出一个异常但是你的finally块引发异常,那么第一个异常就会丢失。 –

+0

明白了。谢谢。 –

相关问题