2012-12-08 35 views
4

看着一個問題,我有錯上期中測試,這我想知道:try/catch/finally中發生了什麼?

public double[] readInputFile(String fielane) throws IOException 
{ 
    File inputFile = new File(filename); 
    Scanner in = new Scanner(inputFile); 
    try 
    { 
    readData(in); 
    return data; 
    } 
    finally 
    { 
    inputFile.close(); 
    } 
} 

這是否會通過所有異常備份鏈,還是會只通過檢查IOException異常?

回答

5

finally塊將被執行,然後最初拋出的異常(也就是由於readData(in)而拋出的第一個異常)會滲透。

我想這個問題的警告是關於將被滲透的異常的類型。這可以是IOException或任何類型的未經檢查的異常(即,java.lang.RuntimeExceptionjava.lang.Error的子類)。

EDITED按@ zapl的評論:如果finally塊拋出IOException(爲inputFile.close()的結果),該異常將被滲出到主叫方,不管try塊是否拋出異常與否。

+0

所以我想這個方法會「將任何類型的異常傳回給調用者。」?這是可選的多項選擇答案之一。另一個(關閉)是「此方法將任何IOException類型錯誤傳回給調用者。」 – agent154

+0

任何異常。這包括'IOException'(如'throws'子句中所述),以及可能發生的'RuntimeException'的任何實例('RuntimeException'是未經檢查的異常,例如'NullPointerException')。但是'finally'塊將會執行。 – Isaac

+2

如果'finally'塊拋出另一個'Exception' [> example](http://ideone.com/tzMCUG),原始'Exception'可以被覆蓋。 – zapl

1

finally塊內的代碼將始終執行,與上述try塊內是否發生異常無關。

在您的示例中,finally塊確保關閉輸入文件;因此,即使發生異常,也可以保證連接不會打開。

1

這會傳遞所有異常備份鏈,還是隻會通過檢查的IOException?

它會錯過所有的異常,但對於代碼編譯readData應該聲明拋出僅IOException或它的子類。

正如往常一樣,finally塊將在try塊之後執行。