ArrayIndexOutOfBoundsException错误,但我认为代码没问题

时间:2015-10-11 12:31:43

标签: java swing indexoutofboundsexception

所以我有一个从我的数据库中填充JTable的函数。

我在这里

public static TableModel resultSetToTableModel(ResultSet rs) {
try {
    ResultSetMetaData metaData = rs.getMetaData();
    int numberOfColumns = metaData.getColumnCount();
    Vector<String> columnNames = new Vector<String>();

    // Get the column names
    for (int column = 0; column < numberOfColumns; column++) {
    columnNames.addElement(metaData.getColumnLabel(column + 1));
    }

    // Get all rows.
    Vector<Vector<Object>> rows = new Vector<Vector<Object>>();

    while (rs.next()) {
    Vector<Object> newRow = new Vector<Object>();

    for (int i = 1; i <= numberOfColumns; i++) {

                if(isObjectInteger(rs.getObject(i)) && i>1) //checks if the value is Integer else not and is past the first column
                {
                    System.out.println(i+"="+rs.getObject(i));
                    String label = columnNames.get(i); //THE ERROR IS ON THIS PART
                    newRow.addElement(getValue((Integer) rs.getObject(i),label)); //gets the value of specific foreign key id from another table
                }
                else 
                {
                    System.out.println(i+"="+rs.getObject(i));
                    newRow.addElement(rs.getObject(i));
                } //inside row (new Rows)
    }

    rows.addElement(newRow); //outside row
    }
    return new DefaultTableModel(rows, columnNames)
        {
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
} catch (Exception e) {
    e.printStackTrace();

    return null;
}
}

我的数据库中共有8列,System.out.println的输出为:

那个在其他地方内的人:

1=1
2=test
3=A.
4=test
5=test
6=test

一个人在if

里面
7=1
8=23

正如您所看到的那样,输出是正确的,但它总是抛出数组索引超出范围:String label = columnNames.get(i);上的8错误

1 个答案:

答案 0 :(得分:1)

虽然ResultSet.getObject()需要基于1的参数,columnNames是一个向量,其索引基于零。

因此,有效值为0..7 1..8。换句话说,if语句的第一部分应该是:

System.out.println(i + "=" + rs.getObject(i));
String label = columnNames.get(i-1); // NOT "i".