Finally 的實用性
從過去幾個 Praxis 可以得知無論是否 catch exception 都會執行 finally,這樣的特性在兩個情境下特別的實用:
- 維護物件內部的狀況
- 清理 non-memory 的資源
如果打開一個 Socket 或是 File ,都可能會拋出 IOException
這個時候 finally 就會顯現用處。
1 | public static void main (String args[]){ |
無論是否產生 IOException
都會跑到 finally 裡面,把 socket 關掉,確保資源不會洩露。
Java 7 中的 Try With Resources
Java 7 後有一項小修正稱作 Try-with-resources ,也就是在離開 Try 區塊的時候,自動關閉資源,這在其它語言像 Python,其實都已經有實作了,主要原因是開發者還是很容易會忘記要 close resource,所以從 Java 7 以後,這類型的程式碼可以這樣寫:
1 | try(OutputStream output = new FileOutputStream(file)){ |
如此一來簡單許多,就不會忘記關 resource 了!
Try With Resources 實現原理
這類型的 resource ,在 Java 7 其實都實現了一個 AutoCloseable
的 interface ,這個 interface 就只有一個很簡單的方法就是 close
,所以應該是在 compile 處理的時候會在 bytecode 自動加上這段程式碼,以解決開發者老是忘了處理 resource 的問題。