【发布时间】:2014-01-17 07:41:51
【问题描述】:
我最近将 Oracle JDBC 驱动程序版本从 11.2.0.1 升级到了 12.1.0.1。但是,我注意到了一件非常奇怪的事情。在我的一项测试中,我使用以下 Java 代码关闭了 ResultSet 对象两次:
if (resSet != null) {
try {
resSet.getStatement().close();
} catch (NullPointerException ne) {
// nothing to do!
// NullPointerException seen at Oracle and Sybase!
}
}
当我使用旧的 JDBC 驱动程序 11.2.0.1 时,这没有任何异常。但是当我切换到新的 JDBC 驱动程序 12.1.0.1 时,它会抛出一个异常:
java.sql.SQLException: Closed Resultset: getStatement
at oracle.jdbc.driver.InsensitiveScrollableResultSet.getStatement(InsensitiveScrollableResultSet.java:272)
为什么会这样?当我检查 ResultSet 的 JavaDoc 时,它说:在已经关闭的 ResultSet 对象上调用方法 close 是无操作的。
所以现在我很困惑,调用 close 两次是无操作意味着它不应该抛出任何异常,对吧?
我正在使用带有 java.sql.ResultSet 的 JDK7u45。
【问题讨论】:
-
它可能会抛出 RuntimeException 或 Error。使用 try 和 catch 块的更好方法
-
您没有在结果集上调用
close,而是调用了getStatement。 -
对不起,我没有说清楚,我已经在使用 try-catch 块。我只需要知道为什么行为会有所不同。现在更新我的问题...
-
这段代码的目的是什么?正如亨利所说,是
getStatement()抛出java.sql.SQLException: Closed Resultset而不是close() -
我已经接受了答案。感谢您的评论@Henry。
标签: java