我有一个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块完成之前执行finally块的情况。是什么导致这种情况?

最佳答案

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

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


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


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

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

10-08 13:10