问题描述
在while循环期间,结果集出现问题。它给我一个错误 java.sql.sqlException:ResultSet关闭后不允许进行操作,我无法弄清楚。谁能帮我吗?谢谢!
public static void CandidatesPartyList_JComboBox() {
try {
conn1 = VotingSystem.con();
ps = conn1.prepareStatement("SELECT * FROM partylist WHERE p_status = 'Active' ORDER BY p_name ASC");
rs = ps.executeQuery();
candidates_filter_partylist.removeAllItems();
candidates_filter_partylist.addItem("- Select PartyList -");
while (rs.next()) { **<< The problem is coming from here**
candidates_filter_partylist.addItem(rs.getString("p_name"));
}
} catch (Exception e) {
e.printstacktrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printstacktrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (Exception e) {
e.printstacktrace();
}
}
if (conn1 != null) {
try {
conn1.close();
} catch (Exception e) {
e.printstacktrace();
}
}
}
}
解决方法
您有名为conn1
,ps
和rs
的静态变量。静态表示整个 虚拟机只有一个变量。
然后很明显,CandidatesPartyList_JComboBox
被不同的线程调用了两次,因此变量被覆盖。
解决方案是:所有这些都不应该是字段。它们应该是局部变量,并且您应该使用try-with-resources,这使此代码的大小小于一半,并且可以解决此问题。我们还修复错误的错误处理(“打印堆栈跟踪”不处理任何事情,因此请不要编写并更新您的IDE模板)。
public static void CandidatesPartyList_JComboBox() {
try (Connection c = VotingSystem.con();
PreparedStatement ps = c.prepareStatement("SELECT * FROM partylist WHERE p_status = 'Active' ORDER BY p_name ASC");
ResultSet rs = ps.executeQuery()) {
candidates_filter_partylist.removeAllItems();
candidates_filter_partylist.addItem("- Select PartyList -");
while (rs.next()) {
candidates_filter_partylist.addItem(rs.getString("p_name"));
}
} catch (SQLException e) {
throw new RuntimeException("Unhandled",e);
}
}