搜尋

首頁  >  問答  >  主體

java - BufferedReader关闭流的问题

PHP中文网PHP中文网2767 天前1032

全部回覆(4)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:27:05

    這個問題其實無須過多困擾。也沒必要​​往JDK1.7的try-with-resources上扯。
    先關閉資源放在try塊裡一定會有問題:資源可能不會被關閉。
    所以資源的關閉應該放在finally裡,這沒有什麼疑問。
    至於finally區塊裡close資源會額外引入IOE,這也是無法避免的。 IOE,这也是无法避免的。
    目前(就我见到过的)绝大多数代码里,捕获IOE目前(就我見過的)絕大多數程式碼裡,捕獲IOE後,最多打一條log,更多的是noop,即no operations,do nothing
    close的時候IOE發生的幾率很小,它應該屬於一種作業系統層面的error,選擇忽略它是正確的選擇,畢竟你的系統不能因為一個資源關閉錯誤而停止運作。況且,如果你硬要捕捉這個IOE,那能做些什麼。

    如果不想在finally區塊裡引入try-catch,我看過guava的一種關閉方式,寫個工具方法叫做closeQuietly(),不吵不鬧就挺好。

    回覆
    0
  • PHPz

    PHPz2017-04-18 09:27:05

    謝邀
    可以考慮Java7的try with resource

    try (BufferedReader br = ...) {
        //...
    } catch (IOException ex) {
        //...
    }

    參考

    回覆
    0
  • PHPz

    PHPz2017-04-18 09:27:05

    來一發安利,Lombok,一個可以讓你少一些程式碼的增強函式庫。

    @CleanUp

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:27:05

    同意1樓的答案,你補充的問題,也是由於IDE的問題。

    另外對於實作了 AutoCloseable 和 Closeable 介面的資源,最好都使用 try-with-resources結構。

    以你的程式碼作為範例,省略了一些程式碼

    try{
        reader.readline();
    }catch(IOException e){
        e.printStackTrace();
    }finally {
        try {
           reader.close();
        } catch (IOException e) {
           e.printStackTrace();
        }
    }

    假設 readline 和 close 都發生io異常,使用 JDK1.7 前的異常捕捉結構,只能捕捉到 close 的異常,readline 的異常被抑制了。 (因為 finally 的程式碼必須執行)

    另一個問題,在 try-with-resources 中資源的 AutoCloseable 的 close 方法什麼時候執行?

    在執行完 try 程式碼區塊的程式碼之後就會執行(這裡不貼實驗程式碼了),所以使用 try-with-resources 的結構,catch 區塊和 finally 區塊都是在資源進行關閉之後才會執行的。

    回覆
    0
  • 取消回覆