在while循环中关闭ResultSet后不允许进行操作

问题描述

在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();
            }
        }
    }
}

解决方法

您有名为conn1psrs的静态变量。静态表示整个 虚拟机只有一个变量。

然后很明显,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);
    }
}