我正在尝试创建一个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);
}
我想再次确定错误的原因并不一定是解决问题的方法。
答案 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索引处添加元素。