try-with-resource——優雅的處理資源關閉問題
我們都知道,對於資源來的連接,比如數據庫連接,文件輸入輸出流等,不管是正常執行完成還是在執行過程中出現了異常,都需要對我們使用的資源進行釋放,在JAVA7以前,可以使用try-catch-finally/try-finally
進行處理,finally就是不管try/try-catch中的邏輯是否正常走完,都會走入finally語句中,甚至是前面使用了return語句想跳出該方法執行邏輯都不行,finally中的代碼塊還是會執行的。所以finally中的語句塊用來標記必須執行的代碼片段,比如連接資源的釋放,是再好不過的。
對於java7以及以後發佈的版本,新增了try-with-resource這種代碼書寫格式,具體示例如下:
public void readFile(String filePath) throws IOException {
//直接在括號裏面定義初始化對象即可
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
等效於try-catch-finally的格式(也就是java7以前,當然了7以後也可以使用這種格式):
public void readFile(String filePath) throws IOException {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("file.txt"));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} finally {
if (br != null) {
br.close();
}
}
}
使用條件:
任何實現AutoClosable接口的類,當然了也包括Closable接口(Closable接口繼承了AutoClosable)。
使用方式:
對於實現了AutoClosable接口的需要使用優雅自動關閉代碼方式的,在try後面的括號中初始化該對象即可,多個可以使用分號(java中的分行符)隔開。
注意:在try後面的括號中,只能有對象的初始化代碼,不能包含其它代碼邏輯,否則編譯不通過,是非法的代碼格式,一般常用的IDE工具都能夠提示出來。
多資源示例:
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"))) {
//do something
}
注意(NOTE)
try-with-resource也可以和try一起連着catch以及finally使用,但是在try-with-resource代碼快中,catch或者finally中的代碼塊是在資源被關閉後才執行的。
有興趣的可以看下官方文檔https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html