Resultset对象关闭的问题

从此安心潜水被占用 2012-08-01 04:01:46
今天在做一个查询功能,遇到了这样一个问题,关闭resultset对象时出现了莫名其妙的异常,如下:
if (null != rs && !rs.isClosed()) {
rs.close();
}
这样写就会出现java.lang.AbstractMethodError: com.mysql.jdbc.ResultSet.isClosed()Z的错误
而if (null != rs) {
rs.close();
}这样写就没有问题,难道 !rs.isClosed()这样一句判断出异常了吗?
求大神给解答
...全文
1164 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
brightyq 2012-08-02
  • 打赏
  • 举报
回复
更改一下
是com.mysql.jdbc.Connection实现了java.sql.Connection的isClosed()方法。
brightyq 2012-08-02
  • 打赏
  • 举报
回复
楼主再去好好确认下吧。
查看了源码,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方法。不过和楼主说的无关。)
游一游走一走 2012-08-02
  • 打赏
  • 举报
回复
《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
游一游走一走 2012-08-02
  • 打赏
  • 举报
回复
楼主下载个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;
  • 打赏
  • 举报
回复
额,刚刚看了下 ,分给错了,本来该给30楼的,我给弄错了,抱歉啊30楼,楼主小白,求原谅
di_wq 2012-08-02
  • 打赏
  • 举报
回复
你用的那个数据库版本有点低,那个方法是没有实现的,所以会出现异常,别用那个方法了,换种写法判断非空性,或者重装新版本的数据库
  • 打赏
  • 举报
回复
28楼和32楼答案不错,该给谁分呢,纠结
试试可能都给点,第一次发帖,不知道可行
闲人のMr丶Wu 2012-08-02
  • 打赏
  • 举报
回复
时常也遇到这样的问题,也犯愁不知如何解决,跟楼主学习,呵呵、、、
B_Lee 2012-08-02
  • 打赏
  • 举报
回复
楼主这样做你就知道怎么回事了:

写一个接口:
interface A{
public void a();
}
然后写一个类B实现它,并将这个类的class文件导出成jar包。

这时候新建个工程,复制A接口和上面的jar包到环境变量。
这时候你就可以用
A a = new B();
但你调用a.b()的时候就会说b是个抽象方法
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]
if(rs!=null){
try {

rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
上面好像没写对啊
[/Quote]
几楼,我现在已经改了,把!rs.isclosed()这个条件去掉了,恢复了我的原来的代码,表示到现在为止不知道异常发生的原因……
anyanlongA 2012-08-01
  • 打赏
  • 举报
回复

if(rs!=null){
try {

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

  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

个人认为是你 mysql驱动包 的问题,可能是版本过低,建议isClosed()方法 用上,然后你换一个 新的mysql驱动包试试,看看是否还还有问题
[/Quote]
mysql-connector-java-5.0.8-bin.jar
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

敢不敢贴出原码让我跑试一下
[/Quote]
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();
}
}
}
风尘中国 2012-08-01
  • 打赏
  • 举报
回复
个人认为是你 mysql驱动包 的问题,可能是版本过低,建议isClosed()方法 用上,然后你换一个 新的mysql驱动包试试,看看是否还还有问题
anyanlongA 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

try {

rs.close();

} catch (SQLException e) {
e.printStackTrace();
}

直接这样写就行了,不用if
[/Quote]
好久没用servlet 了,都忘了,不知道对否
anyanlongA 2012-08-01
  • 打赏
  • 举报
回复
try {

rs.close();

} catch (SQLException e) {
e.printStackTrace();
}

直接这样写就行了,不用if
wwwcomcn123 2012-08-01
  • 打赏
  • 举报
回复
敢不敢贴出原码让我跑试一下
gukuitian 2012-08-01
  • 打赏
  • 举报
回复
什么版本的驱动包?
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

楼上发的是java.sql.ResultSet这个接口的API,isClosed()方法是1.6才加入的。

实现的类是com.mysql.jdbc.ResultSet,应该是这里并没有实现isClosed方法。我这没源码,反编译的
com.mysql.jdbc.ResultSet.class文件是没有这方法
[/Quote]
我同学就这么用的,木有问题,不明白为什么,故而求教各位大神
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

楼上发的是java.sql.ResultSet这个接口的API,isClosed()方法是1.6才加入的。

实现的类是com.mysql.jdbc.ResultSet,应该是这里并没有实现isClosed方法。我这没源码,反编译的
com.mysql.jdbc.ResultSet.class文件是没有这方法
[/Quote]
不过我同事就是用的这么判断的,没有问题……
加载更多回复(15)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧