Java 关闭结果集两次将引发异常

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) { //

我最近将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是不可操作的,这意味着它不应该抛出任何异常,对吗


我将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
not
close()
我接受了答案。感谢您的评论@Henry。它可能会引发RuntimeException或错误。使用try-and-catch-block的更好方法您没有对结果集调用
close
,您调用了
getStatement
。很抱歉,我没有清楚地提到,我已经在使用try-catch-block了。我只想知道为什么行为上会有差异。现在更新我的问题…这段代码的目的是什么?正如Henry所说,是
getStatement()
抛出
java.sql.SQLException:Closed Resultset
not
close()
我接受了答案。谢谢你的评论@Henry。