在 Java 有許多必須透過調用 close 方法來關閉的資源,像是 InputStream、java.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
沒有留言:
張貼留言