处理异常而不使用try / catch

时间:2018-03-13 10:33:31

标签: java exception exception-handling coding-style

我有一个方法,其中抛出的异常必须由调用者处理,而不是由方法本身处理(签名中指定的异常,而不是正文中指定的异常)。 但是,如果发生了不好的事情,我想在调用者必须处理问题之前使用类似于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。

1 个答案:

答案 0 :(得分:1)

这是你如何做到的。使用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())

as

    new InputStreamReader(is)

因为它们是等价的:检查javadoc。另一个重写仅仅是为了可读性,尽管它确实说明了try-with-resources可以管理多个资源。