今天在做一个查询功能,遇到了这样一个问题,关闭resultset对象时出现了莫名其妙的异常,如下:
if (null != rs && !rs.isClosed()) {
rs.close();
}
这样写就会出现java.lang.AbstractMethodError: com.mysql.jdbc.ResultSet.isClosed()Z的错误
而if (null != rs) {
rs.close();
}这样写就没有问题,难道 !rs.isClosed()这样一句判断出异常了吗?
求大神给解答
if (null != rs && !rs.isClosed()) {
rs.close();
}
这样写就会出现java.lang.AbstractMethodError: com.mysql.jdbc.ResultSet.isClosed()Z的错误
而if (null != rs) {
rs.close();
}这样写就没有问题,难道 !rs.isClosed()这样一句判断出异常了吗?
求大神给解答
解决方案 »
- strus2中action与含有frameset的jsp的数据交互问题,有源码,在线等解答阿
- 改变 struts2 中 struts.xml 默认路径
- 在线交流
- 如何在jsp页面中实现数据库的备份与恢复???请高手赐教
- 又是javascript?
- 菜鸟提问:Class XXXX is not a Servlet 是什么意思?
- select中的value值如何得到??
- 下载eclipse都需要下载什么东西 啊 。
- jap链接sql server错误,在线等待!!!
- 换个环境学习,散分,顺便问个问题。
- htmlparser提取<font id="myid">这是一个测试</font>之间字符
- 求一段JS代码
try {
if(rs != null && !rs.isClosed()){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
if (null != rs && !rs.isClosed()) {
rs.close();
}
if (null != pstmt) {
pstmt.close();
}
} catch (SQLException e) {
logger.error(e.getMessage());
throw e;
}但是还是出现了那样的异常,怎么回事?
rs.isClosed()此方法可能会抛出运行时异常
ResultSet没有isClosed方法吧,只有isClosed属性
楼上的同学们.
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 - 如果发生数据库访问错误
com.mysql.jdbc.ResultSet.class文件是没有这方法
e.printStackTrace();
}直接这样写就行了,不用if
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();
}
}
}
if(rs!=null){
try {rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
上面好像没写对啊
查看了源码,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方法。不过和楼主说的无关。)
是com.mysql.jdbc.Connection实现了java.sql.Connection的isClosed()方法。
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;
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
interface A{
public void a();
}
然后写一个类B实现它,并将这个类的class文件导出成jar包。这时候新建个工程,复制A接口和上面的jar包到环境变量。
这时候你就可以用
A a = new B();
但你调用a.b()的时候就会说b是个抽象方法