2020/07/02

[筆記] Effective Java #9 try-with-resources 優先於 try-finally

Effective Java 3rd 簡體中文版筆記 #9 try-with-resources 優先於 try-finally
在 Java 有許多必須透過調用 close 方法來關閉的資源,像是 InputStreamjava.sql.Connection 等。一般 try-finally 的寫法如下,在 try 與 finally 區塊都有可能丟出例外 (exception),下方程式中,如果在 readLine 發生例外,那有很大的機率在 finally 中也會丟出例外,這樣會增加 debug 難度,因為最早發生的例外已經被覆蓋掉了。當多個 try-finally 寫在一起時,也會讓程式碼不易閱讀。
public String readFirstLine(String path) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        br.close();
    }
}
在 Java 7 中提供 try-with-resources 語法,要使用該語法必須實作 AutoClosable,該介面中只有 close 方法。在 try-with-resources 中一樣可以用 catch 來接住例外,寫法也較簡潔,同樣的 concatFirstLine 方法用上述兩種方式撰寫的程式碼如下。如果 resources 是確定要關閉的話,請優先考慮使用 try-with-resources。
// try-finally
public String concatFirstLine(String path1, String path2) throws IOException {
    BufferedReader br1 = new BufferedReader(new FileReader(path1));
    try {
        BufferedReader br2 = new BufferedReader(new FileReader(path2));
        try {
            return br1.readLine() + br2.readLine();
        } finally {
            br2.close();
        }
    } finally {
        br1.close();
    }
}

// try-with-resources
public String concatFirstLine(String path1, String path2) throws IOException {
    try (BufferedReader br1 = new BufferedReader(new FileReader(path1));
         BufferedReader br2 = new BufferedReader(new FileReader(path2))) {
        return br1.readLine() + br2.readLine();
    }
}
轉載請註明原文網址 https://cookieandcoketw.blogspot.com/2020/07/effective-java-9-try-with-resources.html

沒有留言:

張貼留言