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方法丟擲的異常。