Java 结果集关闭后,不允许执行结果集、空指针异常和SQLException操作

Java 结果集关闭后,不允许执行结果集、空指针异常和SQLException操作,java,sql,Java,Sql,我是java和SQL新手,我在重复一个我不知道如何避免的问题: 假设我要创建两个executeQuery,一个在getRequestsFromDB方法中,一个在另一个内部,我创建第一个executeQuery,而在第二个方法中,我创建第二个executeQuery的是Professional HassThat Professional: private Vector<ClientRequest> getRequestsFromDB() throws SQLException {

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

假设我要创建两个executeQuery,一个在getRequestsFromDB方法中,一个在另一个内部,我创建第一个executeQuery,而在第二个方法中,我创建第二个executeQuery的是Professional HassThat Professional:

 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;
}
在第二个循环中,我得到一个SQLException:“ResultSet关闭后不允许操作”,我尝试了: 最后使用result.close()关闭结果,但我也得到异常null指针异常

我真的不知道该怎么处理,好吗?
谢谢大家!

您正在重用
\u语句(我假设它是全局的?)以获得两个不同的
结果集,但在获得第二个
结果集(在内部函数中,自动关闭第一个)后,您将返回到第1个
结果集(在外部函数中)-尝试使用两个单独的语句检查此链接:http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html

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

您正在重复使用您的声明参见以下引用:

  • 当生成ResultSet对象的语句对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象将自动关闭
看起来您正在使用一个类或全局范围语句(
\u Statement
),它支持您尝试迭代的结果集,并在
isprofessionalhasthasprofession
方法中为结果集中的每个条目查询某种类型的详细信息。但是,当您使用相同的
语句执行新查询时,旧结果集将关闭

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

来自Java API:

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

因此,您必须为第二个
结果集
生成一个新的
语句。请不要忘记分别关闭
语句。

可能的重复:和。此外,您还应该真正使用参数化SQL语句。
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;
}