我知道finally
的用途是保證某些指令或清理代碼得到執行。但是使用finally
或在catch塊之後放置代碼的真正區別是什麼。
我的意思是,給我一個例子,你需要使用finally
,否則代碼可能根本不會執行。關於finally塊
回答
最後會執行catch塊中發生的事情。有幾種情況存在。
catch(Exception E)
{
...
throw new OtherException(BetterMessage, E);
}
或
catch { return null; }
或
catch { SomeMethodThatWillThrowAnException(); }
因此,即使您返回或者拋出一個異常退出Catch塊,你還是會執行finally塊,而任何代碼簡單地在try-catch之後將被忽略。
有'try {return; } ...也是如@Petros P建議的那樣,以及'exit()'情況。 – Elist
即使拋出並捕獲,最後一個塊也會發射,無論發生什麼。例如,如果您的catch可能導致進程結束或應用程序崩潰,則放在不在finally塊中的catch之後的代碼可能無法執行。
我明白了。如果應用程序崩潰,我想運行什麼樣的代碼?這實際上是我最感興趣的 –
確保在崩潰的某個地方記錄某些事情。嘗試提醒另一個有關失敗的進程。保存任何用戶數據,你仍然可以。嘗試重新啓動應用程序。無論你想要什麼 - 這更多的是一個架構決定; FINALLY塊絕對不是*永遠*必需的,因爲肯定有時候在上下文中沒有用處。 – kyzen
無論是否引發異常,finally
塊都會執行。
你的問題是,使用finally
和catch
塊後面的區別是什麼。如果拋出異常,catch
塊之後的代碼將不會被執行。如果您將代碼放在finally
區塊中,它將會。
可能會發生一些您不會捕獲的異常。 finally
塊即使在引發意外的異常時也能保證其內部代碼的執行。
終於執行不管什麼。
一個例子
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");
}
在這種情況下,「你好,從抓到底」將不被打印,但「你好,從最後」的意願。
- 1. 語句finally塊
- 2. 僅在finally塊中關閉JDBC連接?
- 3. 關閉數據庫連接()內finally塊
- 4. 空與傳統finally塊用於關閉資源
- 5. 從try塊跳躍finally塊
- 6. try/finally塊問題
- 7. finally塊Application.Run(新main_form)
- 8. 不能跳出finally塊
- 9. 嘗試,catch和finally塊
- 10. 嘗試-finally塊澄清
- 11. 在finally塊中處理
- 12. finally塊來表現不同
- 13. 檢測例外finally塊
- 14. Java異常處理finally塊
- 15. 執行順序和finally塊
- 16. java中的try-catch-finally塊
- 17. 的Java試戴catch- finally塊
- 18. 使用沒有'catch'塊的'try-finally'塊
- 19. return finally before finally
- 20. 我是否需要關閉Quartz調度程序在finally塊中?
- 21. 問題與Source.fromURL當試圖關閉它在finally塊
- 22. 異常來自於最後一個Try-Finally塊
- 23. 如何「終於」下一個finally塊在Android上運行
- 24. 用等於try/finally塊替換使用語句
- 25. 在finally塊中做Response.Write是否正確?
- 26. 斯卡拉尾遞歸從finally塊
- 27. 的Java IO醜陋的try-finally塊
- 28. C# - 的Thread.join(毫秒)和finally塊
- 29. 雙人間異常拋出finally塊
- 30. 如何在Visual Studio中調試finally塊?
即使拋出並不捕獲,或者捕獲並重新拋出或返回,「finally」塊也會執行。 '嘗試{拋出新的錯誤(); } finally {「do somehting」}'仍然運行finally。 –
我可以得到這些場景中的每一個的代碼示例 –