gpt4 book ai didi

java - 在 while(resultSet.next()) 循环中调用 JComboBox#addItem() 最终只有 1 个项目

转载 作者:行者123 更新时间:2023-12-04 06:22:31 25 4
gpt4 key购买 nike

这是给我带来问题的代码。

try{
ResultSet rs = Main.dbase.search("select * from myTable");
//rs.next()
while(rs.next())
{
cmb.addItem(rs.getString(1).trim());
}
rs.close();
} catch (Exception ex) {System.out.println(ex);}

这里dbase是一个执行Statement.executeQuery的对象,cmb是JComboBox。

问题是,即使该表有 10 行,我也只能在 cmb 中得到单行。
如果我不注释掉第一个 rs.next(),我会在 cmb 中得到第二行。

我试图跟踪 rs.next() 的值,发现在 while(rs.next()) 之后,它总是给出 false。

我的目标是在 cmb 中获取所有 10 个值。
正如我所研究的那样,这段代码应该将所有值添加到 cmb,但只添加了一个值。
如果在进入循环之前我调用 rs.next(),那么下一个值会添加到 cmb。

最佳答案

您没有提到您的 catch 是否捕获了任何异常堵塞。

我所看到的可以防止循环比第一行走得更远,下一行有一个 NULL第一列。

确实,如果有NULL"select * from myTable" 返回的任何行的第一列中,然后 rs.getString(1).trim()会抛出 NullPointerException这将中断循环。

你可以通过写来避免这种情况:

try {
ResultSet rs = Main.dbase.search("select * from myTable");
while(rs.next()) {
String result = rs.getString(1);
if (result != null) {
result = result.trim();
}
cmb.addItem(result);
}
rs.close();
} catch (Exception ex) {
System.out.println(ex);
}

此外,我会改进整个代码段,以便:
  • 确保 rs即使发生异常也会关闭
  • 确保我们看到任何异常的完整堆栈跟踪
  • 确保 cmb仅从 EDT(Swing EDT 规则)更新
  • 通过聚合所有 addItems 来避免对 EDT 的太多调用共

  • 那么这就是你所拥有的:
    ResultSet rs = null; 
    try {
    final List<String> allItems = new ArrayList>String>();
    rs = Main.dbase.search("select * from myTable");
    while(rs.next()) {
    String result = rs.getString(1);
    if (result != null) {
    result = result.trim();
    }
    allItems.add(result);
    }
    SwingUtilities.invokeLater(new Runnable() {
    @Overrive public run() {
    for (String item: allItems) {
    cmb.addItem(item);
    }
    }
    });
    } catch (Exception ex) {
    ex.printStacktrace();
    } finally {
    if (rs != null) {
    try {
    rs.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }

    当然,有些部分还可以进一步改进,比如我可能会写一个辅助方法来关闭 ResultSet如果不是 null ,因为这段代码很可能会在很多地方复用。

    关于java - 在 while(resultSet.next()) 循环中调用 JComboBox#addItem() 最终只有 1 个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6380165/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com