Java 不使用try/catch处理异常

Java 不使用try/catch处理异常,java,exception,exception-handling,coding-style,Java,Exception,Exception Handling,Coding Style,我有一个方法,其中抛出的异常必须由调用方处理,而不是由方法本身处理(在签名中指定的异常,而不是在正文中指定的异常)。 但是,如果发生了不好的事情,我想使用类似于finally语句的方法在调用方处理问题之前关闭我的读卡器 在当前配置中,如果触发异常,读卡器将保持打开状态 private static void executeFile(Connection c, String fileName) throws SQLException, IOException { BufferedReade

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

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资源执行的隐式
close()
抛出异常:

  • 如果另一个异常已经传播,则会被抑制
  • 否则它将被传播
注意,我已经重写了`

    new InputStreamReader(is, Charset.defaultCharset())
作为


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

使用try-with-resources。“我想使用类似于
finally
语句的东西”为什么不这样做?(当然,也可以尝试使用资源)。您可以放置一个finally块,但不包含catch块。您可以在其中提取代码,并尝试使用一个新方法。这里只有一行。我会选择一个折衷方案:在方法中截取异常,并在
catch
语句中重新抛出它,但也有一个finally语句(当然要声明抛出该异常的方法和文档…)。这样,您仍然可以将异常处理委托给调用方,但也可以关闭资源。
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 */
    }
}