2014-05-22 105 views
0

我知道finally的用途是保證某些指令或清理代碼得到執行。但是使用finally或在catch塊之後放置代碼的真正區別是什麼。
我的意思是,給我一個例子,你需要使用finally,否則代碼可能根本不會執行。關於finally塊

+0

即使拋出並不捕獲,或者捕獲並重新拋出或返回,「finally」塊也會執行。 '嘗試{拋出新的錯誤(); } finally {「do somehting」}'仍然運行finally。 –

+0

我可以得到這些場景中的每一個的代碼示例 –

回答

4

最後會執行catch塊中發生的事情。有幾種情況存在。

catch(Exception E) 
{ 
    ... 
    throw new OtherException(BetterMessage, E); 
} 

catch { return null; } 

catch { SomeMethodThatWillThrowAnException(); } 

因此,即使您返回或者拋出一個異常退出Catch塊,你還是會執行finally塊,而任何代碼簡單地在try-catch之後將被忽略。

+1

有'try {return; } ...也是如@Petros P建議的那樣,以及'exit()'情況。 – Elist

0

即使拋出並捕獲,最後一個塊也會發射,無論發生什麼。例如,如果您的catch可能導致進程結束或應用程序崩潰,則放在不在finally塊中的catch之後的代碼可能無法執行。

+0

我明白了。如果應用程序崩潰,我想運行什麼樣的代碼?這實際上是我最感興趣的 –

+0

確保在崩潰的某個地方記錄某些事情。嘗試提醒另一個有關失敗的進程。保存任何用戶數據,你仍然可以。嘗試重新啓動應用程序。無論你想要什麼 - 這更多的是一個架構決定; FINALLY塊絕對不是*永遠*必需的,因爲肯定有時候在上下文中沒有用處。 – kyzen

0

無論是否引發異常,finally塊都會執行。

你的問題是,使用finallycatch後面的區別是什麼。如果拋出異常,catch塊之後的代碼將不會被執行。如果您將代碼放在finally區塊中,它將會。

0

可能會發生一些您不會捕獲的異常。 finally塊即使在引發意外的異常時也能保證其內部代碼的執行。

1

終於執行不管什麼。

一個例子

public void test() { 
    try { 
     int x = 0; 
     return; 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } finally { 
     System.out.println("Hello from finally"); 
    } 

    System.out.println("Hello from after catch"); 
} 

在這種情況下,「你好,從抓到底」將不被打印,但「你好,從最後」的意願。