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

明白了。謝謝。 –

相關問題