数组索引超出范围

时间:2013-07-27 07:24:51

标签: java arrays string indexoutofboundsexception

我想创建一个组合框,它在运行时从数据库中获取名称。所以我创建了一个空字符串数组,但它抛出了一个异常,即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 个答案:

答案 0 :(得分:10)

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

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

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

  

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

数组大小为0,因此在访问索引0时会抛出异常。

下面是一个用于理解的数组的基本图表。

enter image description here

这是一个长度为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's tutorial on Java arrays
  2. Lists vs Arrays - when to use what

答案 1 :(得分:1)

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

答案 2 :(得分: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而不是数组,因为它有限制你将被定义为

新白痴

答案 3 :(得分: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);
 }