<code>try</code>-with-resources語句是一個聲明一個或多個資源的 <code>try</code> 語句。一個資源作為一個對象,必須在程式結束之後随之關閉。 <code>try</code>-with-resources語句確定在語句的最後每個資源都被關閉 。任何實作了 <code>Java.lang.AutoCloseable的對象</code>, 包括所有實作了 <code>java.io.Closeable的對象</code>, 都可以用作一個資源。
其實Closeable繼承AutoCloseable 的。
示例1:下面的例子讀取檔案的第一行。它使用了 <code>BufferedReader</code> 的一個執行個體來讀取檔案中的資料。<code>BufferedReader</code> 是一個資源,它必須在程式結束之後随之關閉:
在這個例子中, <code>try</code>-with-resources 語句聲明的資源是一個 <code>BufferedReader</code>。聲明語句在緊跟在 <code>try</code> 關鍵字的括号裡面。Java SE 7以及後續版本中,<code>BufferedReader類實作了</code><code>java.lang.AutoCloseable接口</code>。 因為 <code>BufferedReader</code> 執行個體是在 <code>try</code>-with-resource 語句中聲明的, 是以不管 <code>try</code> 語句正常地完成或是發生意外 (結果就是 BufferedReader.readLine 方法抛出IOException),BufferedReader都将會關閉。
測試一把,如果try後面的括号裡面有執行個體不是繼承AutoCloseable接口是怎樣的

同時看看BufferReader:
對比版本:在 Java SE 7之前, 可以使用 <code>finally</code> 塊來確定資源被關閉,不管 <code>try</code> 語句正常地完成或是發生意外。下面的例子使用 <code>finally</code> 塊替換 <code>try</code>-with-resources 語句:
然而,在這個例子中,如果 <code>readLine</code> 和 <code>close</code> 方法均抛出異常,那麼 <code>readFirstLineFromFileWithFinallyBlock</code> 方法将抛出從 <code>finally</code> 塊中抛出的異常; <code>try</code> 塊中抛出的異常被抑制了。與此相反, 在 <code>readFirstLineFromFile這個例子中</code>, 如果 <code>try</code> 塊和 <code>try</code>-with-resources 語句均抛出異常, 那麼 <code>readFirstLineFromFile</code> 将抛出從 <code>try</code> 塊中抛出的異常; <code>try</code>-with-resources 塊抛出的異常被抑制了。在Java SE 7 以及後續的版本中, 你可以檢索被抑制的異常;詳情參見 Suppressed Exceptions。
示例2:資源的 <code>close</code> 方法調用順序與它們的建立順序相反。
可以在一個 <code>try</code>-with-resources 語句中聲明一個或多個資源。下面的例子檢索zip檔案 <code>zipFileName</code> 中所有檔案的名稱并建立一個包含那些檔案名稱的文本檔案:
在這個例子中, <code>try</code>-with-resources 語句包含兩個由分号隔開的聲明: <code>ZipFile</code> 和 <code>BufferedWriter</code>。當代碼塊直接伴随着它正常地或由于一個異常終止時, <code>BufferedWriter</code> 和 <code>ZipFile對象的</code> <code>close</code> 方法以這種順序自動地調用 。注意:資源的 <code>close</code> 方法調用順序與它們的建立順序相反。
示例3:
下面的例子使用一個 <code>try</code>-with-resources 語句來自動關閉一個 <code>java.sql.Statement</code> 對象:
這個例子中使用的 <code>java.sql.Statement</code> 這個資源是JDBC 4.1以及後續版本API的一部分。
注意: 一個 <code>try</code>-with-resources 語句可以像普通的 <code>try</code> 語句那樣有 <code>catch</code> 和 <code>finally</code> 塊。在<code>try</code>-with-resources 語句中, 任意的 <code>catch</code> 或者 <code>finally</code> 塊都是在聲明的資源被關閉以後才運作。
與 <code>try</code>-with-resources 語句關聯的代碼塊可能會抛出異常。在 <code>writeToFileZipFileContents這個例子中</code>, 當試圖關閉 <code>ZipFile</code> 和 <code>BufferedWriter</code> 對象時,<code>try</code> 塊可能會抛出一個異常,并且 <code>try</code>-with-resources 語句可能抛出多達兩個異常 。如果 <code>try</code> 塊抛出異常并且 <code>try</code>-with-resources 語句抛出一個或多個異常,那麼從 <code>try</code>-with-resources 語句中抛出的異常将會被抑制, 并且塊抛出的異常是由 <code>writeToFileZipFileContents</code> 方法抛出的那一個。你可以通過調用由 <code>try塊抛出的異常的</code><code>Throwable.getSuppressed</code> 方法檢索這些被抑制的異常資訊。
參見 <code>AutoCloseable</code> 和 <code>Closeable</code> 接口的Javadoc可以看到實作了兩者當中的任何一個接口的類集。<code>Closeable</code> 接口繼承了 <code>AutoCloseable</code> 接口。 <code>Closeable</code>接口的 <code>close</code> 方法抛出<code>IOException</code> 類型的異常而 <code>AutoCloseable</code> 接口的 <code>close</code> 方法抛出 <code>Exception 類型的異常。</code>是以, subclasses of the <code>AutoCloseable</code> 接口的子類可以重寫 <code>close</code> 方法的這個行為來抛出指定的異常,例如 <code>IOException</code>, 或者沒有異常。
使用try-with-resource方法之後有如下兩個好處:
代碼變得簡潔可讀
所有的資源都托管給try-with-resource語句,能夠保證所有的資源被正确關閉,再也不用擔心資源關閉的問題。