2015-03-20 2 views
2

Я пытаюсь создать метод fillArray, который заполняет и массирует 20 случайных значений и суммирует каждое третье значение. Я получаю ArrayExceptionOutOfBounds в строке 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); 
} 

Снова я ищу, чтобы определить причину ошибки, не обязательно способ ее исправить.

+2

Если вы смотрели его в отладчике, вы наблюдали, что k стал 21, и вы поняли, почему. – immibis

+0

Спасибо всем за помощь, почему-то я думал, что когда k достигнет значения 21, это не будет вызвано. тупой ошибка с моей стороны. Спасибо – noobtube

ответ

3

Вот ваша проблема:

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

K будет равна 0, то 3, то 6, и т.д., до тех пор, пока не достигнет 21, а затем вы пытаетесь получить доступ к [21], который из границы.

Это связано с тем, что когда k = 18 на 6-й итерации цикла while, значение (k < 20) истинно, и поэтому цикл while продолжается и добавляет еще 3 к k, делая его 21. После этого цикл while останавливается, так как k не является менее чем 20 больше оставляя K со значением 21.

1

вы получаете ошибку, потому что вы удара 21 на массиве с размером 20. Для того, чтобы исправить:

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

Ваш второй цикл , где вы вычисляете сумму, является циклом do/while, что означает, что условие всегда будет проверено. после th e loop body выполняется. Вы считаете k пошагово 3, то есть он достигнет 21 в какой-то момент до условие while (k < 20) возвращает false, что приводит к ошибке.

0

Я думаю, проблема в том, что k увеличивается и используется как индекс массива, перед тестом < 20.

что-то подобное может работать лучше:

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

В общем, я думаю, что делать, пока построить здесь немного ненужной сложности. Версия выше легче читать и является более распространенной моделью.

0

С текущей логикой k будет 3,6,9,12,15,18 и 21. Последнее значение отвечает за исключение за пределами. Ваш цикл не будет останавливаться на 18, как это меньше, чем 20. Вы могли бы решить эту ошибку, изменив свой код на этот:

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

Вы увеличиваете индекс массива перед его использованием. Таким образом, вы не только выходите за пределы индекса массива в последнем проходе, но также не добавляете элемент в индекс 0.

Смежные вопросы