我想创建一个组合框,它在运行时从数据库中获取名称。所以我创建了一个空字符串数组,但它抛出了一个异常,即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);
}
答案 0 :(得分:10)
数组是一个容器对象,它包含固定数量的单个类型的值。创建数组时,将建立数组的长度。创建后,其长度是固定的。您正在创建一个数组来保存0个元素。
String s[]=new String[0]; //<< intialized with length 0
当您尝试访问其第一个元素s[0]
时,它会抛出ArrayindexoutOfBoundsException
。
抛出以指示已使用非法索引访问数组。 索引为负数或大于或等于数组的大小。
数组大小为0
,因此在访问索引0
时会抛出异常。
下面是一个用于理解的数组的基本图表。
这是一个长度为10
的数组,从0
到9
建立索引。
由于您在声明数组本身时不知道数据结构需要存储的元素数量。最好在您的情况下使用动态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 :(得分: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);
}