关闭文件 read/write 操作的正确异常处理

Proper exception handling on closing file read/write operations

我想要的是减少方法抛出的异常。
如您所见,我在外部 catch 块中有一个内部 try catch 以避免抛出异常。
这是执行此操作的常规方法还是有更好(更优雅)的方法?
还是这种方法完全错误,我应该抛出异常?

public static String readText(String filename) {        
    String text = "";
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(filename));
        String line = null;
        while( (line = br.readLine()) != null ){
            text += line;
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(br != null)
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    return text;
}

就我个人而言,我会选择更现代的方法 Files.readAllLines();Files.lines();

然后您只需要处理一个 IOException,系统会自动为您清理资源。

如果您使用的是 Java 7 或更高版本,您可以尝试使用资源。

try (BufferedReader br =
               new BufferedReader(new FileReader(path))) {
    String line = null;
    while( (line = br.readLine()) != null ){
        text += line;
    }
}

有几种方法可以使您想做的事情更简洁:

  1. 使用 Java 7 功能一次捕获多个异常:

    try {...} catch(FileNotFoundException | IOException e) {...} 
    
  2. 使用名为 try-with-resources 的 Java 7 功能,这样您就可以省略最后:

    try (BufferedReader br =
        new BufferedReader(new FileReader(filename))) {
    }
    

关于是否抛出异常是一个设计选择:

  • 是否要向上层报告错误?
  • 我可以处理上层的错误吗?