今天在做一个查询功能,遇到了这样一个问题,关闭resultset对象时出现了莫名其妙的异常,如下:
if (null != rs && !rs.isClosed()) {
rs.close();
}
这样写就会出现java.lang.AbstractMethodError: com.mysql.jdbc.ResultSet.isClosed()Z的错误
而if (null != rs) {
rs.close();
}这样写就没有问题,难道 !rs.isClosed()这样一句判断出异常了吗?
求大神给解答

解决方案 »

  1.   

    此方法可能会抛出异常,所以要try catch 捕获下。
    try {   
       if(rs != null && !rs.isClosed()){   
           rs.close();   
       }   
    } catch (SQLException e) {      
       e.printStackTrace();
    }  
      

  2.   

    刚没有写全,我就是这么写的try {
    if (null != rs && !rs.isClosed()) {
    rs.close();
    }
    if (null != pstmt) {
    pstmt.close();
    }
    } catch (SQLException e) {
    logger.error(e.getMessage());
    throw e;
    }但是还是出现了那样的异常,怎么回事?
      

  3.   

    3楼的神马意思啊,是java.sql.ResultSet啊,就是它错的,正常情况下那样写实木有问题的,可现在它就出现了这个奇葩的问题,哪位大虾能解决,200分送上
      

  4.   

    既然判断了null=rs, rs.isClosed()没必要判断了。rs.colse()调用后rs对象就会自动关闭且被回收!
    rs.isClosed()此方法可能会抛出运行时异常
      

  5.   


    ResultSet没有isClosed方法吧,只有isClosed属性
      

  6.   

    if (null != rs && !rs.isClosed()) if (null != rs || !rs.isClosed()) 这个我真有点欢乐了
    楼上的同学们.
      

  7.   

    java.lang.AbstractMethodError应该是虽然java api, ResultSet接口有isClosed方法,但mysql并没有提供实现的这个方法。
      

  8.   

    实际上,及时rs.close()以后,rs依然不是空的,如下式API直接复制的:
    close
    void close()
               throws SQLException立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。 
    关闭 ResultSet 对象不会关闭 ResultSet 创建的 Blob、Clob 或 NClob 对象。Blob、Clob 或 NClob 对象至少在创建它们的事务期间持续有效,除非调用了其 free 方法。 当关闭 ResultSet 时,所有通过调用 getMetaData 方法创建的 ResultSetMetaData 实例都可以访问。 注:当生成 ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列获取下一个结果时,该 Statement 对象将自动关闭 ResultSet 对象。 在已关闭的 ResultSet 对象上调用 close 方法是无操作 (no-op)。 
    抛出: 
    SQLException - 如果发生数据库访问错误
      

  9.   

    楼上发的是java.sql.ResultSet这个接口的API,isClosed()方法是1.6才加入的。实现的类是com.mysql.jdbc.ResultSet,应该是这里并没有实现isClosed方法。我这没源码,反编译的
    com.mysql.jdbc.ResultSet.class文件是没有这方法
      

  10.   

    try {rs.close();} catch (SQLException e) {
    e.printStackTrace();
    }直接这样写就行了,不用if
      

  11.   

    好久没用servlet 了,都忘了,不知道对否
      

  12.   

    个人认为是你 mysql驱动包 的问题,可能是版本过低,建议isClosed()方法 用上,然后你换一个 新的mysql驱动包试试,看看是否还还有问题
      

  13.   

    public Employee selectEmployee(Connection conn, String sqlName,
    String sqlvalue) throws SQLException {
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    Employee emp = new Employee();
    String sql = "select * from Employee where " + sqlName + "=?";
    try {
    pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, sqlvalue);
    rs = pstmt.executeQuery();
    while (rs.next()) {
    emp.setEmployeeNo(rs.getString("EmployeeNo"));
    emp.setUserName(rs.getString("UserName"));
    emp.setPassword(rs.getString("Password"));
    emp.setRoleID(rs.getString("RoleID"));
    emp.setName(rs.getString("Name"));
    emp.setiDNumber(rs.getString("IDNumber"));
    emp.setBirthday(rs.getDate("Birthday"));
    emp.setGender(rs.getString("Gender"));
    emp.setStatus(rs.getString("Status"));
    emp.setDepartmentID(rs.getString("DepartmentID"));
    emp.setEmployForm(rs.getDate("EmployForm"));
    emp.setEmployTo(rs.getDate("EmployTo"));
    }
    return emp;
    } catch (SQLException e) {
    logger.error(e.getMessage());
    throw e;
    } finally {
    if (null != rs && !rs.isClosed()) {
                             rs.close();
                            }
                            if(null != pstmt && !pstmt .isClosed()){
                             pstmt.close();                        
    }
    }
    }
      

  14.   

     
    if(rs!=null){
    try {rs.close();
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    上面好像没写对啊
      

  15.   

    几楼,我现在已经改了,把!rs.isclosed()这个条件去掉了,恢复了我的原来的代码,表示到现在为止不知道异常发生的原因……
      

  16.   

    楼主再去好好确认下吧。
    查看了源码,com.mysql.jdbc.ResultSet.java中是没有isClosed()方法的。
    楼主说看了api有这个方法,不知道看的是哪个api
    是否查看的是java.sql.ResultSet.java? 它是一个接口,isClosed只是一个方法声明,没有方法体的。java.lang.AbstractMethodError: com.mysql.jdbc.ResultSet.isClosed()Z
    这句错误已经明确说了。
    当应用程序试图调用一个抽象方法时,会抛出此错误。所以isClosed()方法是没有被实现的。(java.sql.Connection.java倒是有个isClosed方法。不过和楼主说的无关。)
      

  17.   

    更改一下
    是com.mysql.jdbc.Connection实现了java.sql.Connection的isClosed()方法。
      

  18.   

    楼主下载个jd-gui.exe看看里面的源码就知道了吧
    mysql-connector-java-5.0.8-bin.jar里面的com.mysql.jdbc.ResultSet这个方法是不支持isClosed()这个方法的
    mysql-connector-java-5.0.8-bin.jar对应的是JDBC3
    JDK1.6对应的是JDBC4,请查看下API(java.sql.ResultSet)
        /**
         * @return true if this <code>ResultSet</code> object is closed; false if it is still open
         * @throws SQLException if a database access error occurs
         * @since 1.6
         */
     boolean isClosed() throws SQLException;
      

  19.   

    《jdbc4.0-fr-spec.pdf》
    JDBC API changes
    ResultSet
    Added the methods getHoldability, getRowId, updateRowId, 
    getNClob, isClosed, getNString, getNCharacterStream, 
    updateNCharacterStream, updateNString, getSQLXML, 
    updateSQLXML and updateNClob. Overloaded the methods 
    updateAsciiStream, updateBinaryStream, 
    updateBlob,updateCharacterStream and updateClob Modified 
    updateObject.《mysql-connector-java-5.0.8-bin.jar》-->MANIFEST.MF-->
    Specification-Title: JDBC
    Specification-Version: 3.0
      

  20.   

    楼主这样做你就知道怎么回事了:写一个接口:  
    interface A{
       public void a();
    }
    然后写一个类B实现它,并将这个类的class文件导出成jar包。这时候新建个工程,复制A接口和上面的jar包到环境变量。
    这时候你就可以用
    A a = new B();
    但你调用a.b()的时候就会说b是个抽象方法