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