Java 关闭结果集两次将引发异常
我最近将Oracle JDBC驱动程序版本从11.2.0.1升级到12.1.0.1。然而,我注意到一件非常奇怪的事情。在我的一个测试中,我使用以下Java代码两次关闭ResultSet对象:Java 关闭结果集两次将引发异常,java,Java,我最近将Oracle JDBC驱动程序版本从11.2.0.1升级到12.1.0.1。然而,我注意到一件非常奇怪的事情。在我的一个测试中,我使用以下Java代码两次关闭ResultSet对象: if (resSet != null) { try { resSet.getStatement().close(); } catch (NullPointerException ne) { //
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是不可操作的,这意味着它不应该抛出任何异常,对吗
我将JDK7u45与java.sql.ResultSet一起使用。如注释中所示,您不是在调用
ResultSet.close()
,而是在调用ResultSet.getStatement()
之后再调用Statement.close()
调用reset.getStatement()
会引发异常,如下所示:
抛出:SQLException
-如果发生数据库访问错误,或者对关闭的结果集调用此方法
(我的重点)正如注释中已经指出的,您不是在调用
ResultSet.close()
,而是在调用ResultSet.getStatement()
之后再调用Statement.close()
调用reset.getStatement()
会引发异常,如下所示:
抛出:SQLException
-如果发生数据库访问错误,或者对关闭的结果集调用此方法
(我的重点)这是符合ResultSet.getStatement API的正确行为
*Throws:
SQLException - if a database access error occurs or this method is called on a closed result set*
这是符合ResultSet.getStatement API的正确行为
*Throws:
SQLException - if a database access error occurs or this method is called on a closed result set*
它可能引发运行时异常或错误。使用try-and-catch-block的更好方法您没有对结果集调用
close
,您调用了getStatement
。很抱歉,我没有清楚地提到,我已经在使用try-catch-block了。我只想知道为什么行为上会有差异。现在更新我的问题…这段代码的目的是什么?正如Henry所说,是getStatement()
抛出java.sql.SQLException:Closed Resultset
notclose()
我接受了答案。感谢您的评论@Henry。它可能会引发RuntimeException或错误。使用try-and-catch-block的更好方法您没有对结果集调用close
,您调用了getStatement
。很抱歉,我没有清楚地提到,我已经在使用try-catch-block了。我只想知道为什么行为上会有差异。现在更新我的问题…这段代码的目的是什么?正如Henry所说,是getStatement()
抛出java.sql.SQLException:Closed Resultset
notclose()
我接受了答案。谢谢你的评论@Henry。