我正在创建JDBC语句和ResultSet.
Findbugs正确地指出,如果抛出异常,我不会关闭它们.
所以现在我有:
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(); } }
(只有我有更多的结果集和准备好的陈述等等……所以我的最后一个嵌套是相当深的)
(旁白:在Symbian中,他们永远不会让析构函数/ close / release / remove -type方法抛出任何错误.我认为这是一个非常好的设计决策.在我看来,JDBC中所有关闭的方法都会抛出sqlException会使事情变得不必要地复杂化. )
解决方法
如果您使用的是Java 7,则可以利用
ResultSet
扩展
AutoCloseable
的事实并使用
try-with-resources语句.
try (Statement sql = <WHATEVER>; ResultsSet res = sql.executeQuery(<WHATEVER>)) { // Use results }
至少那你避免了finally子句.