<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 異常處理 – `try-with-resources`語句 > 原文: [https://javabeginnerstutorial.com/core-java-tutorial/exception-handling-try-resources/](https://javabeginnerstutorial.com/core-java-tutorial/exception-handling-try-resources/) 通常,`finally`塊用于關閉所有資源(即文件,數據庫連接,套接字或在任務完成后應關閉的任何東西),以防止任何泄漏。 *示例代碼:* ```java public class ResourceMgt { public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new FileReader("C://test.txt")); System.out.println(br.readLine()); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) try { br.close(); } catch (IOException e) { e.printStackTrace(); } } //finally } // main } ``` 如果您看上面的示例代碼,要關閉`BufferedReader`資源,我們必須檢查它是否仍然打開,然后調用`close()`方法。 `close`方法可能會引發異常,因此必須將其包圍在`try catch`塊中。 對于每個打開的資源,都將重復此代碼。 對于大型應用,由于這個原因,您將看到很多重復的代碼。 在 Java 7 和更高版本中,`try-with-resources`語句可確保在該語句的末尾關閉所有打開的資源。 因此,`try-with-resources`語句不過是聲明一個或多個資源的`try`語句。 所謂資源就是實現`java.lang.AutoCloseable`接口的任何對象。 該接口又包括實現`java.io.Closeable`接口的所有對象。 因此,使用`try-with-resources`語句的同一示例可以寫成: ```java public class ResourceMgt { public static void main(String[] args) { try(BufferedReader br = new BufferedReader(new FileReader("C://test.txt"))){ System.out.println(br.readLine()); } catch (IOException e) { e.printStackTrace(); } } // main } ``` 在`try`關鍵字之后立即引入一個括號,并且所有資源都應僅在該括號內聲明。 這些資源用分號分隔。 如您所見,使用`try-with-resources`語句的代碼 * 減少行數即可讀取。 * 代碼看起來很整潔。 * 如果`finally`塊的唯一目的只是關閉資源,則不需要。 * 自動資源管理。 在我們的示例中,由于在`try-with-resource`語句中聲明了`BufferedReader`實例,因此無論`try`語句是否成功完成,都將關閉它(如``readLine()`方法可以引發`IOException`)。 **值得注意的要點**: * `try-with-resources`語句就像普通的`try`語句一樣。 它可以擁有常規`catch`和`finally`塊。 * 重要的是要記住,在`catch`和`finally`塊運行之前,已聲明的資源已關閉。 * 要在同一`try`語句中聲明多個資源,必須使用 例如, ```java try(BufferedReader br = new BufferedReader(new FileReader("C://test.txt")); ZipFile zf = new ZipFile("test1.zip")){…} ``` * 一旦`try-with-resources`塊完成(成功完成或引發異常),這些資源的`close`方法將以相反的順序自動調用。 考慮以上示例, `ZipFile`和`BufferedWriter`的`close()`方法將按照上述順序(即反向順序)被調用,以避免可能出現的任何依賴問題。 * 如果在初始化任何資源時有任何問題,那么到目前為止所有已初始化的資源都將以相反的順序關閉。 * 要將自定義類用作資源,這些類必須實現[`lang.AutoCloseable`](https://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html)或[`java.io.Closeable`](https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.html)接口。 * `Closeable`和`AutoCloseable`接口的`close()`方法分別引發`IOException`和`Exception`類型的異常。 * 由于`AutoCloseable`接口的子類可以覆蓋`close`方法的此行為以引發專門的異常(例如`IOException`或根本沒有異常),因此最好使用`AutoCloseable`進行自定義。 ## `AutoCloseable`接口的自定義實現: `AutoCloseable`接口非常容易實現,因為它只有一個方法`close()`。 ```java public interface AutoClosable { public void close() throws Exception; } ``` 讓我們創建兩個實現`AutoCloseable`接口的自定義類, `Bar.java` ```java public class Bar implements AutoCloseable{ public Bar(){ System.out.println("Inside Bar Class"); } public void doSomething(){ System.out.println("Doing something in Bar!"); } public void close() throws Exception{ System.out.println("Closed Bar"); } } ``` `Foo.java` ```java public class Foo implements AutoCloseable{ public Foo(){ System.out.println("Inside Foo Class"); } public void doSomething() throws Exception{ throw new Exception("Exception from Foo doSomething() method"); } public void close() throws Exception{ System.out.println("Closing Foo"); throw new Exception("Unable to close Foo..."); } } ``` `Foo`類的`doSomething()`和`close()`方法引發異常。 `MyTryWithResources.java` ```java public class MyTryWithResources { public static void main(String[] args){ try(Bar b = new Bar(); Foo f = new Foo()){ b.doSomething(); f.doSomething(); }catch(Exception ex){ System.out.println("In catch... " + ex); }finally{ System.out.println("In finally..."); } } } ``` ### 輸出: ![try with resources output](https://img.kancloud.cn/e9/c6/e9c6049f02cfd025d913f20aac1b93df_686x191.png) **說明**: 1. 這里首先要注意的是打開和關閉資源的順序。 打開欄,然后打開`Foo`,但在關閉時,遵循相反的順序。 `Foo`關閉,然后關閉`Bar`資源。 2. `Foo`的`close()`會引發異常,但是如果您注意到生成的輸出,則會將其抑制。 `MyTryWithResources`的`main`方法僅引發由`doSomething()`在`try`塊中生成的異常。 這是在`try-with-resources`中要理解的主要概念。 讓我們嘗試逐步傳播這些信息, * `Bar`和`Foo`資源在`try-with-resources`塊中創建。 * `Try`塊開始執行。 * `Bar`類的`doSomething()`成功執行,并輸出消息“在`Bar`中做某事!” 進行控制臺。 * `Foo`類的`doSomething()`方法引發異常。 * 在將控件轉移到`catch`方法以處理異常之前,通過調用資源各自的`close()`方法來關閉資源。 * `Foo`類的`close()`將消息“正在關閉`Foo`”打印到控制臺,并拋出一個異常,該異常在`try`塊拋出的異常暴露時被抑制。 * 僅當`try`塊和`try-with-resources`語句(`close()`方法)都拋出異常時,`try-with-resources`語句對這種異常的抑制才發生。 * `Bar`類的`close()`運行,并將消息“`Closing Bar`”顯示在控制臺上。 * 然后,`finally`塊執行。 3. 如果您還想檢索抑制的異常怎么辦? 不要擔心。 在 Java SE 7 和更高版本中,可以使用`getSuppressed()`方法檢索它們。 4. 盡管關閉特定資源時會引發異常,但是所有打開的資源都將被關閉,而與引發的異常無關。 在我們的示例中,盡管關閉`Foo`資源時發生異常,但`Bar`資源也成功關閉。 為了獲取被抑制的異常,只需將行`exception_handler_reference_variable.getSuppressed()`添加到`MyTryWithResources`類的`catch`塊中,如下所示, ```java catch(Exception ex){ System.out.println("No. of suppressed exceptions: " + ex.getSuppressed().length); System.out.println("In catch... " + ex); } ``` ### 輸出: ```java Inside Bar Class Inside Foo Class Doing something in Bar! Closing Foo Closed Bar No. of suppressed exceptions: 1 In catch... java.lang.Exception: Exception from Foo doSomething() method In finally... ``` 通過遵循這些示例,您可以毫不費力地圍繞這個概念進行思考。 祝你今天愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看