关闭bufferedReader时如何处理IOException

时间:2015-02-16 04:37:39

标签: java ioexception

您好我正在学习Java中的异常,我遇到了这种情况的问题。

    public static void main(String[] args){
    String path = "t.txt";
    BufferedReader br = null;
    try{
        br = new BufferedReader(new FileReader(path));
        StringBuilder sbd = new StringBuilder();
        String line = br.readLine();
        while(line != null){
            sbd.append(line);
            sbd.append(System.lineSeparator());
            line = br.readLine();
        }
        String result = sbd.toString();   
        System.out.print(result);
    }catch(IOException e){
        System.out.println(e.getMessage());
    }finally{
        if (br != null) 
            br.close(); //Here it says unreported exception IOException; must be caught or declared to be thrown
    }
}

当我调用方法close()关闭bufferedReader时,它表示未报告的异常IOException;必须被抓或宣布被抛出。

我知道JAVA 7提供了一种非常简单的方法来清理

 try(br = new BufferedReader(new FileReader(path))){
//.... 
}

但在JAVA 7之前,我该怎么办?添加"抛出IOException"主函数声明旁边是一种修复它的方法,但它有点复杂,因为我有一个catch部分来捕获IOExceptions

5 个答案:

答案 0 :(得分:3)

您将其包装到另一个try-catch

}finally{
    if (br != null) 
        try {
            br.close(); //Here it says unreported exception IOException; must be caught or declared to be thrown
        } catch (Exception exp) {
        }
}

现在,如果你关心与否是另一个问题。在我看来,你的目的是尽最大努力关闭资源。如果需要,可以使用flag并将其设置为父true块中的catch(表示应忽略任何后续错误),如果它在{{1}中为false阻止,显示错误消息,例如......

catch

答案 1 :(得分:1)

  在JAVA 7之前,我可以对这种情况做些什么呢?

您可以在try-catch块中添加finally,例如

} finally {
    if (br != null) {
        try {
            br.close();
        } catch (IOException e) {
            // Handle the IOException on close by doing nothing.
        }
    }
}

答案 2 :(得分:0)

添加另一个try catch块

 ... 
    if(br != null)
       try{
            br.close();
       } catch (IOException io){
       }

答案 3 :(得分:0)

我通常会这样编码:

} finally {
    if (br != null) {
        try { 
            br.close();
        } catch(IOException ioe) {
            // do nothing
        }
    }
}

事实上,我曾经写过一个包含closeStream(final InputStream stream)closeStream(final OutputStream stream)closeReader(final Reader reader)等方法的util类,它隐藏了所有这些东西,因为你最终一直在使用它

答案 4 :(得分:0)

这大致是资源试用关闭资源的方式

    BufferedReader br = new BufferedReader(new FileReader(path));
    IOException ex = null;
    try {
        br.read();
        // ...
    } catch(IOException e) {
        ex = e;
    } finally {
        try {
            br.close(); // close quietly
        } catch (IOException e) {
            if (ex != null) {
                ex.addSuppressed(e);
            } else {
                ex = e;
            }
        }
    }
    if (ex != null) {
        throw ex;
    }