Praxis 21. Use finally to avoid resource leaks.

Finally 的實用性

從過去幾個 Praxis 可以得知無論是否 catch exception 都會執行 finally,這樣的特性在兩個情境下特別的實用:

  • 維護物件內部的狀況
  • 清理 non-memory 的資源

如果打開一個 Socket 或是 File ,都可能會拋出 IOException 這個時候 finally 就會顯現用處。

1
2
3
4
5
6
7
8
public static void main (String args[]){
ServerSocket serverSocket = new ServerSocket(199);
try{
Socket socket = serverSocket.accept();
} finally{
socket.close();
}
}

無論是否產生 IOException 都會跑到 finally 裡面,把 socket 關掉,確保資源不會洩露。

Java 7 中的 Try With Resources

Java 7 後有一項小修正稱作 Try-with-resources ,也就是在離開 Try 區塊的時候,自動關閉資源,這在其它語言像 Python,其實都已經有實作了,主要原因是開發者還是很容易會忘記要 close resource,所以從 Java 7 以後,這類型的程式碼可以這樣寫:

1
2
try(OutputStream output = new FileOutputStream(file)){
}

如此一來簡單許多,就不會忘記關 resource 了!

Try With Resources 實現原理

這類型的 resource ,在 Java 7 其實都實現了一個 AutoCloseable 的 interface ,這個 interface 就只有一個很簡單的方法就是 close,所以應該是在 compile 處理的時候會在 bytecode 自動加上這段程式碼,以解決開發者老是忘了處理 resource 的問題。