簡體   English   中英

返回方法時的ArrayExceptionOutOfBounds

[英]ArrayExceptionOutOfBounds when returning the method

我試圖創建一個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);
}

我再次試圖確定錯誤的原因,而不一定是解決它的方法。

這是您的問題:

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

K將等於0,然后是3,然后是6,依此類推,直到達到21,然后您嘗試訪問超出范圍的A [21]。

這是因為在while循環的第6次迭代中,當k = 18時(k < 20)為真,因此while循環繼續進行,並在k上加上了另外3個使其成為21。此后,while循環停止了,因為k不是小於20,則k的值為21。

之所以會出現錯誤,是因為您在一個大小為20的數組上命中了21。

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

計算總和的第二個循環是一個do / while循環,這意味着在循環體執行始終會檢查條件。 你算k中的3個步驟了,這意味着它會在之前的一些點達到21 while (k < 20)條件返回false,導致你的錯誤。

我認為問題在於,在<20測試之前,k正在遞增並被用作數組索引。

這樣的事情可能會更好:

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

通常,我認為這里的do while構造有點不必要的復雜性。 上面的版本更易於閱讀,是更常見的模式。

在當前邏輯下,k將為3、6、9、12、15、18和21。最后一個值是導致越界異常的原因。 您的循環不會停止在18處,因為它小於20。您可以通過將代碼更改為此來解決該錯誤:

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

您需要先增加數組索引,然后再使用它。 因此,您不僅在上一遍超越了數組索引,而且還沒有在0索引處添加元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM