我有一个看起来像这样的try-catch-finally块:
ResultSet rs;
PreparedStatement ps;
Connection conn;
try {
for (int i = 0; i < list.size(); i++) {
** execute SQL query **
}
} catch (Exception e) {
throw e;
} finally {
** close result set **
** close prepared statement **
** close connection **
}
我已经验证我的ArrayList列表中有534个元素。问题是,在我的for循环第一次出现之后,关闭所有内容的finally块正在执行,导致下一次出现抛出异常,因为现在连接已关闭。
我从未遇到过try块在try块完成之前执行的情况。什么可能导致这种情况?
答案 0 :(得分:2)
基本上,正在发生的事情是finally
按预期工作。简短的解释是finally
块执行无论 try
块如何终止。
在您的示例中,根据您所说的内容,最可能出现的情况如下:
finally
块。在finally
块“终止”之前不会执行try
块,因此您的理论认为finally
块导致循环体到失败是不正确的。
参考:http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
答案 1 :(得分:0)
如果没有更多来源我会猜测你没有提交你的交易。
如果您将连接切换为不自动提交,然后忘记提交您的交易,那么似乎就像您的finally
块在查询之前正在执行,而实际上它们只是在等待执行前提交。
请参阅here进行讨论。