【问题标题】:ArrayExceptionOutOfBounds when returning the method返回方法时的ArrayExceptionOutOfBounds
【发布时间】:2025-11-24 12:55:01
【问题描述】:

我正在尝试创建一个 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);
}

我再次希望确定错误的原因,不一定是修复它的方法。

【问题讨论】:

  • 如果你在调试器中看过它,那么你已经看到 k 变成 21 并且你明白了为什么。
  • 感谢大家的帮助,由于某种原因,我认为当 k 达到 21 的值时,它不会被调用。我的愚蠢错误。谢谢

标签: java arrays debugging error-handling


【解决方案1】:

这是你的问题:

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

K 将等于 0,然后是 3,然后是 6,以此类推,直到达到 21,然后您尝试访问超出范围的 A[21]。

这是因为在 while 循环的第 6 次迭代中 k = 18 时,(k &lt; 20) 为真,因此 while 循环继续并在 k 中添加另一个 3,使其成为 21。之后,while 循环停止,因为 k 是不再小于 20,而 k 的值为 21。

【讨论】:

    【解决方案2】:

    您收到错误是因为您在大小为 20 的数组上点击 21。修复:

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

    【讨论】:

      【解决方案3】:

      您计算总和的第二个循环是一个 do/while 循环,这意味着条件将始终在循环体执行后得到检查。您将k 计数为 3,这意味着它会在某个时间点达到 21while (k &lt; 20) 条件返回 false,从而导致您的错误。

      【讨论】:

        【解决方案4】:

        我认为问题在于,在

        这样的事情可能会更好:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            在使用它之前增加数组索引。因此,您不仅在最后一遍中超出了数组索引,而且还没有在 0 索引处添加元素。

            【讨论】:

              最近更新 更多