![](/img/trans.png)
[英]Method returning a NullPointerException when it should be returning a -1
[英]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.