ResultSet 关闭后不允许出现 ResultSet、空指针异常和 SQLException 操作

Posted

技术标签:

【中文标题】ResultSet 关闭后不允许出现 ResultSet、空指针异常和 SQLException 操作【英文标题】:ResultSet, null pointer exception and SQLException operation not allowed after ResultSet closed 【发布时间】:2013-01-11 19:14:52 【问题描述】:

我是 java 和 SQL 的新手,我重复了一个我不知道如何避免的问题:

假设我想做两个 executeQuery,一个在另一个里面,在 getRequestsFromDB 方法中我做第一个 executeQuery,在第二个方法 isProfessionalHasThatProfession 我做第二个 executeQuery:

 private Vector<ClientRequest> getRequestsFromDB() throws SQLException 
    Vector<ClientRequest> retVal = new Vector<ClientRequest>();
    ResultSet result = null;
    try 
        for (int i=0 ; i<_userBean.getProfession().length ; ++i )
            result = _statement.executeQuery("SELECT * FROM "+_dbName+"."+CLIENTS_REQUEST_TABLE+" WHERE "+CLIENTS_REQUEST_T_PROFESSION+"='"+_userBean.getProfession()[i]+"'");               
            while(result.next()) //HERE IN THE SECOND LOOP GETTING NULL EXCEPTION

                if(isProfessionalHasThatProfession(result.getString(CLIENTS_REQUEST_T_PROFESSION)))
                    retVal.add(cr);
                    ClientRequest cr = new ClientRequest
                            (result.getString(CLIENTS_REQUEST_T_CLIENT_ID), 
                            result.getString(CLIENTS_REQUEST_T_CITY),
                            result.getString(CLIENTS_REQUEST_T_DATE),
                            result.getString(CLIENTS_REQUEST_T_PROFESSION));
                
            
        
     catch (SQLException ex) 
        throw ex;
    
    return retVal;

第二个功能:

private boolean isProfessionalHasThatProfession(String profession) throws SQLException              
    ResultSet result = null;
    try 
        result = _statement.executeQuery("SELECT "+WORKER_PROFESSIONS_T_PROFESSION+" FROM "+_dbName+"."+WORKER_PROFESSIONS_TABLE+" WHERE "+WORKER_PROFESSIONS_T_PROFESSIONAL_ID+"='"+_userBean.getProId()+"'");
        while(result.next())
            if(result.getString(1).equals(profession))
                return true;
            
        
     catch (SQLException ex) 
        throw ex;
    
    return false;

在第二个循环中,我得到一个 SQLException:“ResultSet 关闭后不允许操作”,我尝试过: 最后用 result.close() 关闭结果,但我也得到异常空指针异常。

我真的不知道如何处理,想法? 谢谢!

【问题讨论】:

可能重复:***.com/questions/9291619/… 和 ***.com/questions/5840866/…。此外,您真的应该使用参数化的 SQL 语句。 【参考方案1】:

您正在重用 _statement(我认为它是全局的?)来获得 2 个不同的 ResultSets,但是在获得第二个(在内部函数中)之后,您返回到第一个 ResultSet(在外部函数中)函数,它自动关闭第一个) - 尝试使用 2 个单独的语句

【讨论】:

【参考方案2】:

查看此链接:http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html

默认情况下,每个 Statement 对象只能同时打开一个 ResultSet 对象。因此,如果一个 ResultSet 对象的读取与另一个 ResultSet 对象的读取交错,则每个对象都必须由不同的 Statement 对象生成。 Statement 接口中的所有执行方法都会隐式关闭一个语句的当前 ResultSet 对象,如果存在打开的对象。

你正在重复使用你的语句

【讨论】:

【参考方案3】:

请参阅来自ResultSet API 的引用:

当生成它的 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet 对象会自动关闭。

看起来您正在使用一个类或全局范围语句 (_statement),它支持您尝试迭代的结果集,并为您的 @987654323 中的结果集中的每个条目查询某种类型的详细信息@ 方法。但是当您使用相同的 Statement 执行新查询时,您的旧 ResultSet 将关闭。

因此,第二个查询需要单独的语句。

【讨论】:

【参考方案4】:

来自 Java API:

默认情况下,每个 Statement 对象只能打开一个 ResultSet 对象 同时。因此,如果读取一个 ResultSet 对象是 与另一个阅读交错,每个必须已经生成 通过不同的 Statement 对象。

所以你必须为第二个ResultSet 生成一个新的Statement。请不要忘记分别关闭Statements。

【讨论】:

以上是关于ResultSet 关闭后不允许出现 ResultSet、空指针异常和 SQLException 操作的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:ResultSet关闭后不允许操作[重复]

获取 java.sql.SQLException:ResultSet 关闭后不允许操作

结果集自动关闭并显示错误结果集关闭后不允许操作

连接关闭后不允许任何操作

即使 PreparedStatement 仅使用一次,ResultSet 关闭错误后也不允许操作

MySQLNonTransientConnectionException:连接关闭后不允许操作。连接