1. 程式人生 > >java基礎之連線關閉處理——try-with-resource程式碼塊

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