1

次のコードがある場合、これは Connection、ResultSet、および Statement オブジェクトを閉じる正しい方法でしょうか? close()への呼び出しはすべてfinallyブロックに入れるべきだと思います。

Connection con = null;
ResultSet rs = null;
Statement stmt = null;

try{
    //Code before the while loop 
    con = DriveManager.getConnection("Stuff");

    while(someBoolean){          

        stmt = con.createStatement();
        rs = stmt.executeQuery("SQL query");

        // do stuff with query results.

        if( rs != null){
               rs.close();
        }

        if( stmt != null){
               stmt.close();
        }

} //end while

    if( con != null ){
        con.close();
    }

catch (Exception e){
    //handle exception
}
4

4 に答える 4

4

はい、finally例外がスローされる可能性がある場所に関係なく、すべてのリソースを閉じる必要があるため、リソースを閉じるのはブロックにする必要があります。

標準的なパターンは次のとおりです。

Connection con = null;
ResultSet rs = null;
Statement stmt = null;

try {
    con = DriveManager.getConnection("Stuff");
    stmt = con.createStatement();
    rs = stmt.executeQuery("SQL query");
    // do stuff with query results
} catch (SQLException e) { // Don't catch Exception, catch what you expect
    // handle exception
} finally {
    // each close can itself explode, so wrap each in try catch
    try {
       if (rs != null)
           rs.close();
    } catch (SQLException ignore) {} // no point handling

    try {
       if (stmt != null)
           stmt.close();
    } catch (SQLException ignore) {} // no point handling

    try {
       if (con != null)
           con.close();
    } catch (SQLException ignore) {} // no point handling
}

リソースの 1 つを閉じるのに失敗すると、他のリソースも爆発する可能性がありますが、それでもそれぞれを閉じようとするのは良い習慣です。

于 2013-07-08T14:47:02.307 に答える