2013-03-02 74 views
2

之前,我不知道爲什麼,例如下面的代碼片段:打印出最後的catch異常

try{ 
    //here happens a SQLException 
} 
catch(SQLException e){ 
    throw new InstantiationException(); 
} 
finally{ 
    System.out.println("This is the finally"); 
} 

這段代碼的結果將被打印出來"This is the finally"第一和唯一的它打印出InstantiationException後...

+1

請閱讀[The finally Block](http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html)。 – mre 2013-03-02 22:47:53

+0

'throw'應該開始一個新線程。在「catch」中做它有意義嗎? – 2013-03-02 22:55:13

回答

3

Java Language Specification:

如果try塊的執行突然因爲完成的 一個值V拋,然後有一個選擇:

(在try子句的SQLException擲)如果V的運行時類型的分配與可捕獲的 異常類的任何catch子句的兼容try語句,然後選擇第一個(最左邊的)這樣的catch子句。值V被分配給所選catch子句的參數 ,並且該catch子句的塊 被執行。然後有一個選擇:

如果catch塊正常完成,則finally塊將執行 。然後有一個選擇:

如果finally塊正常完成,則try語句 正常完成。

如果finally塊由於某種原因突然完成,那麼由於相同的原因try 語句會突然完成。

如果由於原因R catch塊突然完成,則執行finally 塊。然後有一個選擇:(InstantiationException拋

如果finally塊正常完成,則try語句 突然的原因R.(的System.out.println( 「這是最後」)完成)

我已經在每個執行步驟中以粗體顯示文本。

總結:

  1. 一個SQLException在你的try塊
  2. 控制轉移到抓住你拋出InstantiationException
  3. 最後它處理的SQLException
  4. catch子句突然完成條款拋出塊通過打印您的文本來執行
+1

tnx很多你的時間。現在更清楚 – Rollerball 2013-03-02 23:01:49

+0

@Rollerball歡迎:) – PermGenError 2013-03-02 23:05:05