ResultSet 关闭后不允许操作,mysql

Operation not allowed after ResultSet closed, mysql

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

    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;
    }

}

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

 finally {

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

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

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

    }

我怀疑

有问题
return resultset;

因为您要在 return 加入 ResultSet 之前关闭 ConnectionStatement,所以 ResultSet 可能不可用。您必须知道 finally 块将在 return 值之前执行。这也是为什么当您打开 Connection 时您的代码仍在运行。

因此,您应该将结果存储到某种数据结构中,然后 return。

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

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

附带说明一下,您应该更好地区分异常消息,这样您就可以知道它们来自哪里。