每当我尝试运行此代码时,我得到:“java.sql.SQLException:在ResultSet关闭后不允许操作”。它可以在不关闭连接的情况下工作,但我很好奇为什么我会收到此错误以及关闭连接的正确方法,以下是代码:
public ResultSet UpdateTable(){
Connection con = connect();
ResultSet resultset;
Statement s = null;
resultset = null;
try{
s = con.createStatement();
resultset = s.executeQuery("select * from customera");
return resultset;
}
catch(SQLException e){
System.out.println(e.getMessage());
//con.close();
}
finally{
try{
s.close();
resultset.close();
con.close();
}
catch(SQLException e){
System.out.println(e.getMessage());
}
}
return null;
}
}
答案 0 :(得分:1)
您更愿意检查它们是否有任何引用,然后关闭它们。
finally {
if (resultset != null) {
resultset.close();
}
if (s != null) {
s.close();
}
if (con != null) {
con.close();
}
}
我怀疑,问题
return resultset;
由于您在返回Connection
之前关闭了Statement
和ResultSet
,因此ResultSet
可能无效。您必须知道finally
块将在返回值之前执行。这就是为什么,当您离开Connection
时,您的代码正常工作。
因此,您应该将结果存储到某个数据结构中并返回。
答案 1 :(得分:0)
您的错误可能不是来自您显示的代码。相反,它是由其他代码生成的,因为您在其他代码使用它之前关闭了ResultSet
和Statement
。 (根据文档,关闭Statement
也会关闭其ResultSet
。)
您可以使用此方法中的ResultSet
调用您需要完成的任何代码,或者您可以返回ResultSet
并让调用代码负责关闭它。您的决定可能取决于您的其他代码,但我更愿意将其作为调用代码的责任(因为它专门从此方法获得ResultSet
,它应该知道它必须关闭它。)
作为旁注,您应该更好地区分您的异常消息,以便了解它们的来源。