是什么导致finally块太快执行?

时间:2013-08-13 14:59:23

标签: java exception try-catch-finally

我有一个看起来像这样的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块完成之前执行的情况。什么可能导致这种情况?

2 个答案:

答案 0 :(得分:2)

基本上,正在发生的事情是finally按预期工作。简短的解释是finally块执行无论 try块如何终止。

在您的示例中,根据您所说的内容,最可能出现的情况如下:

  • 循环体抛出一些异常,
  • 捕获并重新抛出异常,
  • 然后执行finally块。

finally块“终止”之前不会执行try块,因此您的理论认为finally导致循环体到失败是不正确的。

参考:http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

答案 1 :(得分:0)

如果没有更多来源我会猜测你没有提交你的交易。

如果您将连接切换为不自动提交,然后忘记提交您的交易,那么似乎就像您的finally块在查询之前正在执行,而实际上它们只是在等待执行前提交。

请参阅here进行讨论。