erickson..
45
在Java 7中,不应显式关闭它们,而应使用自动资源管理来确保关闭资源并正确处理异常.异常处理的工作方式如下:
Exception in try | Exception in close | Result
-----------------+--------------------+----------------------------------------
No | No | Continue normally
No | Yes | Throw the close() exception
Yes | No | Throw the exception from try block
Yes | Yes | Add close() exception to main exception
| | as "suppressed", throw main exception
希望这是有道理的.允许漂亮的代码,像这样:
private void doEverythingInOneSillyMethod(String key)
throws MyAppException
{
try (Connection db = ds.getConnection()) {
db.setReadOnly(true);
...
try (PreparedStatement ps = db.prepareStatement(...)) {
ps.setString(1, key);
...
try (ResultSet rs = ps.executeQuery()) {
...
}
}
} catch (SQLException ex) {
throw new MyAppException("Query failed.", ex);
}
}
在Java 7之前,最好使用嵌套的finally块,而不是测试null的引用.
我将展示的示例可能看起来很难看深嵌套,但实际上,设计良好的代码可能不会在同一个方法中创建连接,语句和结果; 通常,每个嵌套级别都涉及将资源传递给另一个方法,该方法将其用作另一个资源的工厂.使用这种方法,来自a close()的异常将掩盖try块内的异常.这可以克服,但它会导致代码更加混乱,并且需要一个自定义异常类,它提供Java 7中存在的"抑制"异常链.
Connection db = ds.getConnection();
try {
PreparedStatement ps = ...;
try {
ResultSet rs = ...
try {
...
}
finally {
rs.close();
}
}
finally {
ps.close();
}
}
finally {
db.close();
}
Ctrl-Shift-F到您心中的内容!;) (8认同)
如果你把终点放在与右大括号相同的线上,那就不那么难看了.;) (6认同)
@ceving没有人建议可以避免结束陈述.你在回应什么? (2认同)