<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## [Try-With-Resources 用法](https://lingcoder.gitee.io/onjava8/#/book/15-Exceptions?id=try-with-resources-%e7%94%a8%e6%b3%95) 上一節的內容可能讓你有些頭疼。在考慮所有可能失敗的方法時,找出放置所有 try-catch-finally 塊的位置變得令人生畏。確保沒有任何故障路徑,使系統遠離不穩定狀態,這非常具有挑戰性。 `InputFile.java`是一個特別棘手的情況,因為文件被打開(伴隨所有可能因此產生的異常),然后它在對象的生命周期中保持打開狀態。每次調用`getLine()`都可能導致異常,而且`dispose()`也是這種情況。這個例子只是好在它顯示了事情可以混亂到什么地步。它還表明了你應該盡量不要那樣設計代碼(當然,你經常會遇到這種無法選擇的代碼設計的情況,因此你仍然必須要理解它)。 InputFile.java 一個更好的實現方式是如果構造函數讀取文件并在內部緩沖它 —— 這樣,文件的打開,讀取和關閉都發生在構造函數中。或者,如果讀取和存儲文件不切實際,你可以改為生成 Stream。理想情況下,你可以設計成如下的樣子: ~~~ // exceptions/InputFile2.java import java.io.*; import java.nio.file.*; import java.util.stream.*; public class InputFile2 { private String fname; public InputFile2(String fname) { this.fname = fname; } public Stream<String> getLines() throws IOException { return Files.lines(Paths.get(fname)); } public static void main(String[] args) throws IOException { new InputFile2("InputFile2.java").getLines() .skip(15) .limit(1) .forEach(System.out::println); } } ~~~ 輸出為: ~~~ main(String[] args) throws IOException { ~~~ 現在,getLines() 全權負責打開文件并創建 Stream。 你不能總是輕易地回避這個問題。有時會有以下問題: 1. 需要資源清理 2. 需要在特定的時刻進行資源清理,比如你離開作用域的時候(在通常情況下意味著通過異常進行清理)。 一個常見的例子是`java.io.FileInputStream`(將會在[附錄:I/O 流](https://lingcoder.gitee.io/onjava8/#/./Appendix-IO-Streams)中提到)。要正確使用它,你必須編寫一些棘手的樣板代碼: ~~~ // exceptions/MessyExceptions.java import java.io.*; public class MessyExceptions { public static void main(String[] args) { InputStream in = null; try { in = new FileInputStream( new File("MessyExceptions.java")); int contents = in.read(); // Process contents } catch(IOException e) { // Handle the error } finally { if(in != null) { try { in.close(); } catch(IOException e) { // Handle the close() error } } } } } ~~~ 當 finally 子句有自己的 try 塊時,感覺事情變得過于復雜。 幸運的是,Java 7 引入了 try-with-resources 語法,它可以非常清楚地簡化上面的代碼: ~~~ // exceptions/TryWithResources.java import java.io.*; public class TryWithResources { public static void main(String[] args) { try( InputStream in = new FileInputStream( new File("TryWithResources.java")) ) { int contents = in.read(); // Process contents } catch(IOException e) { // Handle the error } } } ~~~ 在 Java 7 之前,try 后面總是跟著一個 {,但是現在可以跟一個帶括號的定義 ——這里是我們創建的 FileInputStream 對象。括號內的部分稱為資源規范頭(resource specification header)。現在`in`在整個 try 塊的其余部分都是可用的。更重要的是,無論你如何退出 try 塊(正常或通過異常),和以前的 finally 子句等價的代碼都會被執行,并且不用編寫那些雜亂而棘手的代碼。這是一項重要的改進。 它是如何工作的? try-with-resources 定義子句中創建的對象(在括號內)必須實現`java.lang.AutoCloseable`接口,這個接口只有一個方法:`close()`。當在 Java 7 中引入`AutoCloseable`時,許多接口和類被修改以實現它;查看 Javadocs 中的 AutoCloseable,可以找到所有實現該接口的類列表,其中包括`Stream`對象: ~~~ // exceptions/StreamsAreAutoCloseable.java import java.io.*; import java.nio.file.*; import java.util.stream.*; public class StreamsAreAutoCloseable { public static void main(String[] args) throws IOException{ try( Stream<String> in = Files.lines( Paths.get("StreamsAreAutoCloseable.java")); PrintWriter outfile = new PrintWriter( "Results.txt"); // [1] ) { in.skip(5) .limit(1) .map(String::toLowerCase) .forEachOrdered(outfile::println); } // [2] } } ~~~ * \[1\] 你在這里可以看到其他的特性:資源規范頭中可以包含多個定義,并且通過分號進行分割(最后一個分號是可選的)。規范頭中定義的每個對象都會在 try 語句塊運行結束之后調用 close() 方法。 * \[2\] try-with-resources 里面的 try 語句塊可以不包含 catch 或者 finally 語句而獨立存在。在這里,IOException 被 main() 方法拋出,所以這里并不需要在 try 后面跟著一個 catch 語句塊。 Java 5 中的 Closeable 已經被修改,修改之后的接口繼承了 AutoCloseable 接口。所以所有實現了 Closeable 接口的對象,都支持了 try-with-resources 特性。
                  <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>

                              哎呀哎呀视频在线观看