我无法解决这个问题:java.lang.ArrayIndexOutOfBoundsException

时间:2012-01-19 11:50:48

标签: java

当我尝试运行以下代码时,我得到一个'java.lang.ArrayIndexOutOfBoundsException'

ResultSet res = null;
    String[] waarden = new String[20];
    int length = 0;
    String query = "SELECT rd_datum, rd_locatie FROM racedag;";
    res = Database.executeSelectQuery(query);
    try{
        while (res.next()){
            int i = 1;
            waarden[i] = res.getString(1);
            i++;
            waarden[i] = res.getString(2);
            i++;
        }

        }
    catch (Exception e){
            }
    finally{
        length = waarden.length;
    }
    String eindWaarden[] = new String[length];
    for (int i = 0; i<= length; i++){
        eindWaarden[i] = waarden[i];
    }
    return eindWaarden;
}

我不知道为什么。

11 个答案:

答案 0 :(得分:7)

您尚未显示异常发生的位置,但有一件事您只是写入waarden[1]waarden[2](作为iwhile循环内声明。我怀疑这是故意的。

此外,您的异常处理非常糟糕 - 只是捕获异常并执行 nothing 是一个坏主意,就像在大多数情况下捕获Exception本身一样。

然后出现了这个问题:

String eindWaarden[] = new String[length];
for (int i = 0; i<= length; i++) {
    eindWaarden[i] = waarden[i];
}

这将始终失败,因为您正在访问eindWaarden[length],这将不在数组的末尾。有效索引为0length - 1,包括<=。如果您想保留该循环(我怀疑),请将<更改为length

哦,waarden总是20,但是你检索的结果很多 - 因为这是String eindWaarden[] 的长度。

此外,虽然此声明有效

waarden
作为一种风格,它通常是气馁的。将所有类型信息保存在一起,就像您对List<String>所做的那样。

如果您只使用String query = "SELECT rd_datum, rd_locatie FROM racedag;"; ResultSet res = Database.executeSelectQuery(query); List<String> results = new ArrayList<String>(); // Removed try block: declare that your method throws SqlException or whatever while (res.next()) { results.add(res.getString(1)); results.add(res.getString(2)); } // Change the method declaration to have a return type of List<String> return results; 代码,那么您的代码会更好

{{1}}

答案 1 :(得分:1)

更改此

for (int i = 0; i<= length; i++){
        eindWaarden[i] = waarden[i];
    }

for (int i = 0; i< length; i++){
        eindWaarden[i] = waarden[i];
    }

答案 2 :(得分:1)

ArrayIndexOutOfBoundsException表示您尝试访问索引无效的数组中的元素(索引超出范围0array.length - 1)。

错误就在这一行:

for (int i = 0; i<= length; i++){

应该是:

for (int i = 0; i < length; i++){

答案 3 :(得分:1)

在最后一个for循环中你说i&lt; = length,我相信它应该只是我&lt;长度

答案 4 :(得分:0)

代码还有其他问题,这就是造成异常的原因:

for (int i = 0; i <= length; i++){

<=更改为<

for (int i = 0; i < length; i++){

答案 5 :(得分:0)

替换

for (int i = 0; i<= length; i++){
    eindWaarden[i] = waarden[i];
}

使用

for (int i = 0; i < length; i++){
    eindWaarden[i] = waarden[i];
}

<代替<=

答案 6 :(得分:0)

修改

我要出来说出来。此代码返回一个20个元素的String数组,其中第一个元素为空,接下来的两个元素将填充给定查询返回的最后一行。数组中的所有其他元素都是空的。

由于SQL不必然保证结果的顺序(除非您指定ORDER BY子句),每次都可以得到一个随机行。

这整件事可以改写为:

final int length = 20;
String[] waarden = new String[20];
final String query = "SELECT rd_datum, rd_locatie FROM racedag LIMIT 1";
ResultSet res = Database.executeSelectQuery(query);

try {
    if (res.next()) {
        waarden[1] = res.getString(1);
        waarden[2] = res.getString(2);
    }
} catch (Exception e) {
    // handle exception
}

return waarden;

这可能不是你打算做的......

答案 7 :(得分:0)

在for循环中使用<代替<=。否则,您正在尝试访问不存在的索引:

for (int i = 0; i< length; i++){
    eindWaarden[i] = waarden[i];
}

答案 8 :(得分:0)

for (int i = 0; i<= length; i++){
    eindWaarden[i] = waarden[i];
}

替换为

for (int i = 0; i< length; i++){
    eindWaarden[i] = waarden[i];
}

答案 9 :(得分:0)

这是错误:

for (int i = 0; i<= length; i++){

数组有N个元素,索引从0到N-1。

所以正确的是:

for (int i = 0; i<length; i++){

答案 10 :(得分:0)

除了已经在其他答案中解决的ArrayIndexOutOfBoundsException,以及@JonSkeet提到的非常糟糕的错误处理,还有这段代码

try{
    while (res.next()){
        int i = 1;
        waarden[i] = res.getString(1);
        i++;
        waarden[i] = res.getString(2);
        i++;
    }

    }
catch (Exception e){
        }
finally{
    length = waarden.length;
}

如果只将值放在索引waarden和索引20,那么1数组的长度为2是否有任何正当理由。查看代码的其余部分,您希望waarden完全填充查询结果,但情况并非如此。您可能希望将int i = 1移到while循环之外,并在0而不是1初始化它。这只有在您确定结果数量永远不会超过10waarden[]太小的情况下才有效