【问题标题】:Operation not allowed after ResultSet closed, mysqlResultSet关闭后不允许操作,mysql
【发布时间】:2018-03-20 20:17:16
【问题描述】:

每当我尝试运行此代码时,我都会得到:“java.sql.SQLException:ResultSet 关闭后不允许操作”。它可以在不关闭连接的情况下工作,但我很好奇为什么会出现此错误以及关闭连接的正确方法是什么,这是代码:

    public ResultSet UpdateTable(){

            Connection con = connect();
            ResultSet resultset;
            Statement s = null;
            resultset = null;
        try{
            s = con.createStatement();
            resultset =  s.executeQuery("select * from customera");
            return resultset;

            }
        catch(SQLException e){
            System.out.println(e.getMessage());
            //con.close();
        }
        finally{
            try{
                s.close();
                resultset.close();
                con.close();
            }
            catch(SQLException e){
                System.out.println(e.getMessage());
            }
        }
        return null;
    }

}

【问题讨论】:

  • 嗯,我要做的第一件事是打印堆栈跟踪,这样您就可以确定来自哪一行。
  • 如何打印堆栈跟踪,我尝试了 System.out.println(e.printstacktrace()) 但不起作用 - 我得到“这里不允许使用 void 类型”。
  • e.printStackTrace(); 将自行打印,不使用println()
  • 我也试过了,但是什么也没打印,只是得到一个红色的长错误消息。

标签: java mysql resultset


【解决方案1】:

您的错误可能不是来自您显示的代码。相反,它是由其他代码生成的,因为您在其他代码使用它之前关闭了 ResultSetStatement。 (根据文档,关闭Statement 也会关闭它的ResultSet。)

您可以在此方法中使用ResultSet 调用您需要完成的任何代码,或者您可以只返回ResultSet 并让调用代码负责关闭它。你的决定可能取决于你的其他代码,但我更愿意让它成为调用代码的责任(因为它专门从这个方法中得到一个ResultSet,它应该知道它必须关闭它。)

作为旁注,您应该更好地区分您的异常消息,这样您就可以知道它们来自哪里。

【讨论】:

  • 谢谢,这是有道理的,但是如果它是从另一个类调用的,调用者将如何关闭它。
  • 那么,这个方法是怎么调用的呢?我假设您有类似ResultSet r = UpdateTable(); 或类似的东西?然后你只需要在你完成所有你需要用r做的事情之后做r.close()
  • 但是关闭连接怎么样?和声明
  • ResultSet 有一个getStatement() 方法,Statement 有一个getConnection() 方法,所以你可以从ResultSet 获取这些并关闭它们。
【解决方案2】:

你宁愿检查它们是否有任何引用,然后关闭它们。

 finally {

        if (resultset != null) {
            resultset.close();
        }

        if (s != null) {
            s.close();
        }

        if (con != null) {
            con.close();
        }

    }

我怀疑,有问题

return resultset;

由于您在返回ResultSet 之前关闭了ConnectionStatement,因此ResultSet 可能不可用。您必须知道finally 块将在返回值之前执行。这也是为什么当您将Connection 保持打开状态时,您的代码正在运行。

因此,您应该将结果存储到某种数据结构中并返回。

【讨论】:

  • @JohnCollins 你删除了resultset.close(); 吗?
  • @Ravi 这不是 NullPointerException。即使它们已关闭,它们也不会为空。尽管也许您可以使用类似的代码来检查它们是否已关闭。
  • @DM 我知道,它们不是 NPE,但我建议关闭它们的正确方法。
  • @Ravi 好吧,好吧,但是你并没有真正回答这个问题(即使这是一个很好的建议。)
  • @JohnCollins 请立即查看我的帖子
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多