0

我想创建一个组合框,它在运行时从数据库中获取名称。所以我创建了一个空字符串数组,但它引发了 arrayindexoutofbound 异常。我认为初始化有错误......

            String s[]=new String[0];
            {
                 try
                {
                  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                  Connection con =DriverManager.getConnection("jdbc:odbc:project","sa","123456");
                  Statement stmt= con.createStatement();
                  ResultSet rs=stmt.executeQuery("SELECT Name FROM company");
                  i=0;
                  while(rs.next()) {        
                        s[i]=rs.getString(1);
                        i++;
                  }
                }
                catch(Exception ex)
                {
                    JOptionPane.showConfirmDialog(f,ex);
                }
                cb=new JComboBox(s);
            }
4

4 回答 4

10

数组是一个容器对象,它包含固定数量的单一类型的值。数组的长度是在创建数组时确定的。创建后,它的长度是固定的。您正在创建一个数组来保存 0 个元素。

String s[]=new String[0]; //<< intialized with length 0

ArrayindexoutOfBoundsException当您尝试访问它的第一个元素时,它会抛出s[0]

抛出以指示已使用非法索引访问数组。索引为负数或大于或等于数组的大小。

Size 数组的大小0,因此在访问 index 时会引发异常0

下面是一个数组的基本图,便于理解。

在此处输入图像描述

它是一个长度数组10,索引从09

由于您在声明数组本身时不知道数据结构需要存储的元素数量。在您的情况下,最好使用动态Collection ,可能是List的任何一种实现,例如ArrayList

List<String> s = new ArrayList<String>();
while(rs.next())
{
   s.add(rs.getString("NAME")); // using column name instead of index "1" here
}

推荐阅读:

  1. Oracle 的 Java 数组教程
  2. 列表与数组 - 何时使用什么
于 2013-07-27T07:25:21.403 回答
1

您创建了长度为 0 的数组。如果您知道需要多少个成员,请使用数组,如果您不知道最好使用 ArrayList

于 2013-07-27T07:37:18.457 回答
1

我也在做一个从数据库获取数据并将其添加到组合框的项目,我更喜欢你把它简单化,不需要创建一个数组,你只需写:

 try
            {
              Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
              Connection con = DriverManager.getConnection("jdbc:odbc:project","sa","123456");
              Statement stmt= con.createStatement();
              ResultSet rs=stmt.executeQuery("SELECT Name FROM company");
              cb=new JComboBox();
              while(rs.next()) {   
                    cb.addItem(rs.getString(1));
              }
            }
            catch(Exception ex)
            {
                JOptionPane.showConfirmDialog(f,ex);
            }
            

注意:如果您想先保存数据然后将其添加到组合框,则应使用 Vector 而不是数组,因为它有限制,您将按照以下说明定义

新白痴

于 2013-07-29T20:36:17.203 回答
1

您还可以使用向量列表:

 {

  Vector<String> namesList;

  try
        {
          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
          Connection con = DriverManager.getConnection("jdbc:odbc:project","sa","123456");
          Statement stmt= con.createStatement();
          ResultSet rs=stmt.executeQuery("SELECT Name FROM company");
          namesList = new Vector<>();

          while(rs.next()) {
                namesList.add(rs.getString(1));
          }
        }
        catch(Exception ex)
        {
            JOptionPane.showConfirmDialog(f,ex);
        }
        cb=new JComboBox(namesList);
 }
于 2013-07-29T21:05:32.093 回答