我遇到了一段看起来像这样的代码
try
{
try (SomeResource res = new SomeResource())
{
// "\(o.o)/" *BOO*
}
}
catch (SomeException e)
{
e.letsNotIgnoreTheException();
}
我想不出使用两个try-blocks的原因。我问的其他任何人都不会想到一个。
我不禁要问,这是否简单 一个需要进行重构的方法,或者如果实际上有一些用于外部尝试(特别是因为我发现了几次,但是又一次, 有人可能只是误解了资源的尝试。
答案 0 :(得分:3)
鉴于实际代码中没有额外的控制流或尝试构造,您的代码等同于:
res.close()
请注意:
e.letsNotIgnoreThisException()
res.close()
在 *BOO*
这里描述了解释资源关闭和异常处理在try-with-resources中的执行顺序的关键线:
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
报价:
注意: try-with-resources语句可以像普通的try语句一样拥有catch和finally块。在try-with-resources语句中,在声明的资源关闭后运行任何catch或finally块。
答案 1 :(得分:1)
你可以参考两篇关于try-catch的文章,并尝试不用catch
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html
答案 2 :(得分:0)
如果外部的try-catch除了内部尝试之外什么都没有,那么它是不必要的,因为你可以将它们组合成一个。但是,如果外部try-catch中还有其他内容,则语义可能会有所不同。
答案 3 :(得分:0)
<强>反驳:强>
这与单个try块的执行方式不同 - try-with-resources转换为关闭finally块中的资源,在 catch块之后执行,而try-with-resources在嵌套的try块在外部catch块之前执行。
如果要在执行catch块之前关闭SomeResource
资源,这可能很有用。
例如,如果您正在将某些内容写入文件并且出错时想删除该文件内容并将错误消息写入同一文件(我知道这是虚拟示例),您可以先关闭资源来执行此操作,然后删除文件并在新的流/资源中写入错误。
答案 4 :(得分:0)
访问数据库时,这种模式经常发生 - 主要是为了确保资源正确关闭,同时在处理每条记录时处理错误而不停止查询。
try {
ResultSet rs = query.executeQuery();
try {
// Each row.
while (rs.next()) {
// Handle each record.
try {
// One row.
} catch (SomeException se) {
// Deal with exception when processing the row so we do not abort the whole query.
}
}
} catch (SQLException se) {
// Perhaps database connection went down during the iteration.
} finally {
// Remember to close - whatever happens.
rs.close();
}
} catch (Exception ex) {
// Probably the query is malformed or something.
log.error("failed", ex);
}