关闭ResultSet两次会抛出异常

时间:2013-12-30 12:07:30

标签: java

我最近将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方法是无操作。

所以现在我很困惑,两次关闭是非操作意味着它不应该抛出任何异常,对吗?

我正在使用JDK7u45和java.sql.ResultSet。

2 个答案:

答案 0 :(得分:3)

正如评论中已经指出的那样,您不是在调用ResultSet.close(),而是调用ResultSet.getStatement(),然后调用Statement.close()

resSet.getStatement()的调用是引发异常的原因,正如JDBC spec/api doc所要求的那样:

  

<强>抛出:
      SQLException - 如果发生数据库访问错误或在关闭的结果集上调用此方法

(强调我的)

答案 1 :(得分:1)

这是符合ResultSet.getStatement API的正确行为

*Throws:

SQLException - if a database access error occurs or this method is called on a closed result set*