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 */
}
}