java基礎之連線關閉處理——try-with-resource程式碼塊
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