2011-01-12 61 views
1

今天在工作中,我不得不查看一個類似於這個模擬例子的代碼片段。終於在例外情況下嵌套的行爲

package test;

import java.io.IOException; 
import org.apache.log4j.Logger; 

public class ExceptionTester { 

    public static Logger logger = Logger.getLogger(ExceptionTester.class); 

public void test() throws IOException { 
    new IOException(); 
} 

public static void main(String[] args) { 
    ExceptionTester comparator = new ExceptionTester(); 
    try { 
     try { 
      comparator.test(); 
     } finally { 
      System.out.println("Finally 1"); 
     } 
    } catch(IOException ex) { 
     logger.error("Exception happened" ex); 
      // also close opened resources 
    } 
    System.out.println("Exiting out of the program"); 
} 

}

它打印以下output.I預期的編譯錯誤,因爲內try沒有一個catch塊。

 
Finally 1 
Exiting out of the program 

我不明白爲什麼IOException由外catch塊捕獲。我將不勝感激,如果任何人都可以解釋這一點,尤其是通過引用堆棧展開過程

+4

`try`必須有> = 1`catch` __和/或``finally`。 'catch'不是必需的。 – dkarp 2011-01-12 03:12:16

回答

6

finally塊表示在正常和異常條件下都必須完成的任務。

示例:您將面試候選人帶到午餐。在午餐時,你會發現他被謀殺的警察通緝。例外!午餐結束了,面試完全失敗,但是......你還得付午餐費。

try { 
    meetForLunch(interviewCandidate); 
} 
finally { 
    lunchBill.pay(); 
} 

請注意,午餐付款沒有考慮到例外情況,您仍然必須在面試時對兇手做點事情。這只是一個鬆散的結局,必須在處理損壞控制之前加以照顧。

塊以這種方式使用的大多數最後:一個文件需要被關閉是否成功保存的數據;一個數據庫連接需要關閉該交易是否被批准與否等

而且該異常繼續以其快捷方式向外尋找在封閉範圍內匹配的catch塊。

請注意,finally塊將始終運行,除非該進程在try塊仍在執行時結束。

+0

當然,如果候選人在午餐中謀殺你,這個比喻就會失效。 :-) – 2011-01-12 03:16:06

0

我認爲問題是,你的功能

public void test() throws IOException { 
    new IOException(); 
} 

實際上並沒有引發異常 - 它只是創建一個新的IOException異常()目的。將其更改爲

public void test() throws IOException { 
    throw new IOException(); 
} 

應該解決這個問題。

+1

這就是爲什麼「異常發生」沒有被打印出來,但它對`finally`塊沒有影響。 – 2011-01-12 03:04:08

0

以上代碼不需要太多的解釋 - 不一定涉及調用堆棧!你有什麼困惑?我錯過了什麼? 這裏是我的解釋

第一點

  • 你不需要既是漁獲物和一個 finally塊。你可以使用 其中一個 或者他們兩個都帶有一個 嘗試塊,但不是都不是。
  • 即使從 try或catch塊中拋出 異常,finally子句 中的代碼也將始終執行。如果您的代碼在try或 catch塊中有返回語句 ,則在從方法返回之前,finally塊中的代碼將執行 。

所以在上面的代碼中,一個異常從未拋出(因爲你是不是在test()方法使用throw) 然而,finally塊得到執行由語言規範的承諾和你有輸出Finally 1。執行順序中的下一個語句是System.out.println("Exiting out of the program");,因爲catch塊永遠不會到達,因爲沒有IOException。所以,打印Exiting out of the program

相關問題