Exception 的 control flow
Java 的異常控制是有助於協助程式處理異常狀況的發生,儘管這些年來在 Checked Exception 和 Unchecked Exception 上有很多的討論,在各種設計上都建議減少 Checked Exception.
但 Java 所設計的 Exception 對於異常狀況的發生,還是對程式的強健性 (Robust) 是有一定程度的提升。
在 Java 裡一旦發生 Exception ,程式的流程會往下列三個地方移動:
- Catch block
- finally block
- calling method
這樣的情形下,就發生了討厭的 Goto 行為(程式執行流程跳來跳去),增加程式除錯的難度。
難以猜測程式執行流程
1 | public void m3(boolean isThrow){ |
上面的程式碼,呈現一個簡單的 try catch 情境,這個 try 並沒有 catch 只有 finally 區塊,而在 finally 區塊結束一行,再加上一行 Print 。
執行結果為:
1 | Enter m3 |
也就是說最行一行的 Exist m3
並沒有被執行,在執行完 finally 後,就離開了。
Try Catch 的執行原則
- 如果同時存在 catch block 以及 finally block ,一旦產生異常會先執行 catch block ,再執行 finally block,如果沒有 catch block 就會直接執行 finally block
- 如果沒有 catch block ,無論異常是否發生都會執行 finally block
- 如果異常發生,沒有被 catch ,無論是否執行 finally, 之後的 statement 將不被執行。