1. 程式人生 > >java帶資源的try語句

java帶資源的try語句

 jdk 1.7之後出現的一個新的語句,主要用於關閉資源。所謂資源,就是一個流,一個連線,一個數據庫連線等。

     在原來關閉資源的時候,用 try-catch-finally 時如果try中的程式碼跑出了一個非 IOException,在執行finally呼叫close方法時close方法本身也會有可能丟擲 IOException 異常。這種情況下,原始的異常將丟失,轉而丟擲close方法的異常。

     在jkd 1.7之前的處理方法較為繁瑣,如下:

    package why;  
      
    import java.io.FileInputStream;  
    import java.io.InputStream;  
      
    public class Advice {  
          
        public static void main(String[] args) {  
            InputStream in = null;  
            Exception ex = null;  
            try{  
                try{  
                    //code…..;  
                } catch (Exception e) {  
                    ex = e;  
                    throw e;  
                }  
            } finally {  
                try {  
                    in.close();  
                } catch (Exception e) {  
                    if(ex == null)   
                        throw e;  
                }  
            }  
        }  
    }  

     在jdk 1.7之後出現了帶資源的try語句,它允許在try關鍵字後緊跟一對圓括號,圓括號可以宣告、初始化一個或多個資源(此處的資源是指那些必須在程式結束時顯式關閉的資源,比如資料庫連線,網路連線等),try-with-resources 是一個定義了一個或多個資源的try 宣告,try語句在該語句結束時自動關閉這些資源。try-with-resources確保每一個資源在處理完成後都會被關閉。這些資源必須實現AutoCloseable或者Closeable介面,實現這兩個介面就必須實現close() 方法。示例如下:

    package why;  
      
    import java.io.FileInputStream;  
    import java.io.PrintWriter;  
    import java.util.Scanner;  
      
    public class Xin {  
      
        public static void main(String[] args) throws Exception {  
      
            try(Scanner in = new Scanner(new FileInputStream(“d:\\haha.txt”));  
                    PrintWriter out = new PrintWriter(“d:\\hehe.txt”)) {  
                while(in.hasNext()) {  
                    out.println(in.next().toUpperCase());  
                }  
            }  
        }  
    }  

其基本語法是:try(資源){資源動作}比如

public static String processFile() throws IOException {
try (
	BufferedReader br = new BufferedReader(new FileReader("D:data.txt"))
    ) 
    { 
	return br.readLine();
    }
}

      一個try-with-resourcse如果在try中開啟多個資源,用分號隔開(某些書裡錯寫成了逗號)。和宣告一個物件相同,會在結束後自動呼叫close方法。 此外,try-with-resources 可以跟catch和finally,catch和finally中的物件是在try-with-resources裡宣告的物件關閉之後才執行(並不建議這樣)。如果try塊和close塊都丟擲一個異常,那麼close塊的異常將會“被抑制”。這些異常將會自動捕獲,並由addSuppressed方法增加到原來的異常。如果對這個異常感興趣,可以呼叫getSuppressed方法,將會得到從close方法丟擲並被抑制的異常列表。

        jdk1.7之後新增加了幾個API:

        1)void addSuppressed(Throwable t)  為這個異常增加一個“抑制”異常。這出現在帶資源的try語句塊中,其中t是close方法丟擲的一個異常。

        2)Throwable[ ] getSuppressed( )   得到這個異常的所有“抑制”異常。一般來說,這些是帶資源的try語句中close方法丟擲的異常。