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 ブロックが my for ループの最初の発生後に実行され、接続が現在閉じられているため、次の発生で例外がスローされることです。

try ブロックが完了する前に finally ブロックが実行される状況に遭遇したことはありません。このシナリオの原因は何ですか?

4

2 に答える 2

2

基本的に、起こっていることfinallyは、期待どおりに機能しているということです。簡単な説明は、ブロックがどのように終了してもfinallyブロックが実行されるということです。try

あなたの例では、あなたが言ったことに基づいて、最も可能性の高いシナリオは次のとおりです。

  • ループ本体が何らかの例外をスローし、
  • 例外がキャッチされ、再スローされます。
  • その後、finallyブロックが実行されます。

ブロックが「終了」finallyする前にブロックは実行されないため、ブロックがループ本体の失敗を引き起こしているという理論は正しくありません。tryfinally

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

于 2013-08-13T15:39:34.530 に答える
0

ソースがなければ、トランザクションをコミットしていないと思います。

接続を自動コミットしないように切り替えてからトランザクションをコミットするのを忘れた場合、実際には実行前にコミットを待っているだけなのに、クエリの前にブロックが実行されているように見える場合があります。finally

ディスカッションについては、こちらを参照してください。

于 2013-08-13T15:02:28.680 に答える