返回方法时ArrayExceptionOutOfBounds

时间:2015-03-20 23:19:03

标签: java arrays debugging error-handling

我正在尝试创建一个fillArray方法,该方法使用20个随机值填充和数组,并将每三个值相加。我在第21行得到一个ArrayExceptionOutOfBounds,这是调用该方法的时候。通过调试我已经看到阵列填充正确的值和正确计算的总和。我想知道错误是什么。

public static void fillArray(){
    //adding up A[0], A[3], A[6}, ...

    double[] A = new double[20];
    for(int i = 0; i < A.length; i++)
        A[i] = Math.random();

    double sum = 0;
    int k = 0;
    do{
        k += 3;
        sum += A[k];
    }while(k < 20);

    System.out.println("sum = " + sum);
}

我想再次确定错误的原因并不一定是解决问题的方法。

6 个答案:

答案 0 :(得分:3)

这是你的问题:

do{
    k += 3;
    sum += A[k];
}while(k < 20);

K将等于0,然后是3,然后是6,等等,直到达到21,然后你尝试访问超出界限的A [21]。

这是因为当在while循环的第6次迭代中k = 18时,(k < 20)为真,因此while循环继续并将另外3添加到k使其成为21.之后,while循环停止为k不再小于20,留下k值为21。

答案 1 :(得分:1)

您收到错误是因为您在尺寸为20的阵列上击中了21。要修复:

 do{
    k += 3;
    if(k <= 20){
       sum += A[k];
   }
}while(k < 20);

答案 2 :(得分:0)

你计算总和的第二个循环是一个do / while循环,这意味着在执行循环体之后总是会检查条件。您将k逐步计算为3,这意味着在 while (k < 20)条件返回false之前将在某个时间点达到21,导致您的错误。

答案 3 :(得分:0)

我认为问题是k在递增并在&lt; 20测试之前被用作数组索引。

这样的事情可能会更好:

for (int k = 0; k < 20; k = k + 3) {
        sum += A[k];
    }

一般来说,我认为这里的do while构造有点不必要的复杂性。上面的版本更容易阅读,是一种更常见的模式。

答案 4 :(得分:0)

使用当前逻辑,k将是3,6,9,12,15,18和21.最后一个值负责越界异常。您的循环不会在18处停止,因为它小于20.您可以通过将代码更改为此来解决错误:

do{
    k += 3;
    sum += A[k];
}while(k < 18);

答案 5 :(得分:0)

在使用之前递增数组索引。因此,您不仅要在最后一次传递中超越数组索引,还要在0索引处添加元素。