如果抛出异常,请确保关闭对象

Wil*_*ill 6 java

我正在创建JDBC StatementResultSets.

Findbugs正确地指出,close如果抛出异常,我不会这些.

所以现在我有:

Statement stmt = null;
ResultSet res = null;
try {
    stmt = ...
    res = stmt.executeQuery(...);
    ...
} finally {
    try {
        if(res != null)
           res.close(); // <-- can throw SQLException
    } finally {
        if(stmt != null)
           stmt.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

(只有我有更多的结果集和准备好的语句等等......所以我的finallys 嵌套更深)

必须有更好的方法来确保关闭大量结果集?

(旁白:在Symbian中,他们永远不会让析构函数/ close/release/remove -type方法抛出任何错误.我认为这是一个非常好的设计决策.在我看来close,JDBC中的所有方法都会SQLException使得事情变得不必要地复杂化.)

Dun*_*nes 4

如果您使用的是 Java 7,那么您可以利用事实ResultSet扩展AutoCloseable并使用try-with-resources语句。

try (Statement sql = <WHATEVER>;
     ResultsSet res = sql.executeQuery(<WHATEVER>)) {
     // Use results
}
Run Code Online (Sandbox Code Playgroud)

至少这样你就可以避免这些finally条款。

  • 遗憾的是,生产停滞在 1.6 :( 但我确实喜欢你向我展示的这种方法,它可以准确地解决这些问题。 (2认同)