我有一个方法,抛出的异常必须由调用方处理,而不是由方法本身处理(签名中指定的异常,而不是主体中指定的异常)。
但是,万一发生不好的情况,我想在呼叫者不得不处理该问题之前,使用类似于finally语句的方法来关闭我的阅读器。

在当前配置中,如果触发了异常,则读取器保持打开状态。

private static void executeFile(Connection c, String fileName) throws SQLException, IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), Charset.defaultCharset())); // $JL-I18N$

    /*
        Lot of stuff happen here, and might trigger exceptions
    */

    reader.close();

}


有没有办法处理这种情况?还是应该重构该方法以单独处理异常?

编辑

评论中提供了一些好的提示。我最终选择考虑的解决方案是提取触发警告的代码并使用try-with-resources。

最佳答案

这就是你的做法。使用try-with-resources。

private static void executeFile(Connection c, String fileName)
       throws SQLException, IOException {
    try (InputStream is = new FileInputStream(fileName);
         InputStreamReader isr = new InputStreamReader(is);
         BufferedReader reader = new BufferedReader(isr)) {
        /* Lots of stuff */
    }
}


在try块中引发的异常将被传播,并且读取器堆栈将被关闭。如果(假设)由try-with-resource执行的隐式close()抛出异常:


如果另一个异常已经传播,它将被抑制,
否则它将被传播。


注意,我已经重写了`

    new InputStreamReader(is, Charset.defaultCharset())




    new InputStreamReader(is)


因为它们是等效的:请检查javadoc。另一个重写只是为了提高可读性,尽管它确实说明了“尝试资源”可以管理多个资源。

09-30 14:41
查看更多