【问题标题】:Closing ResultSet twice throws an exception关闭 ResultSet 两次抛出异常
【发布时间】: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


【解决方案1】:

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

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

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

(强调我的)

【讨论】:

    【解决方案2】:

    根据 ResultSet.getStatement API,这是正确的行为

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 2010-12-21
      • 2014-06-29
      • 2012-01-21
      相关资源
      最近更新 更多