0

我有一个看起来像这样的 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 个元素。问题是关闭所有内容的 finally 块是在我的 for 循环第一次出现之后执行的,这会导致下一次出现抛出异常,因为连接现在已关闭。

我从未遇到过 finally 块在 try 块完成之前执行的情况。什么可能导致这种情况?

4

2 回答 2

2

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

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

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

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

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

于 2013-08-13T15:39:34.530 回答
0

如果没有更多来源,我猜你没有提交交易。

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

请参阅此处进行讨论。

于 2013-08-13T15:02:28.680 回答