2013-05-18 3 views
6

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

int [] numbers; 
    numbers = new int[25]; 

    numbers[0] = 1; 
    numbers[1] = 1; 
    System.out.println("Initializing the array values"); 

    for(int i = 2; i < numbers.length; i++) 
    { 
     numbers[i] = numbers[i-1] + numbers[i-2]; 
    } 

    System.out.println("Printing out Fibonacci values"); 

    for(int i = 0; i < numbers.length; i++) 
    { 
     System.out.print(numbers[i] + ", "); 
    } 

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

Initializing the array values 
Printing out Fibonacci values 
1, 1, 2, 3, 8, 34, 377, 17711, Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 34 
at ArrayDemo.main(ArrayDemo.java:21) 

Я не понимаю, что пошло не так. Изменение второго цикла не должно изменять значения (вы заметите, что значения фибоначчи неверны (т. Е. Отсутствуют значения)). И я не понимаю, почему простой расширенный цикл будет пропускать индексы. Теперь это не очень большое дело, потому что это не проект или что-то еще, это просто задевает меня, что я не могу понять, почему он это делает. Любые подсказки?

Усиленная петля только выглядела так:

for(int i : numbers) 
    { 
     System.out.print(numbers[i] + ", "); 
    } 

ответ

5
for(int i : numbers) 
{ 
    System.out.print(numbers[i] + ", "); 
} 

i вот что элементы на массиве, а не индексирует. Он может быть больше numbers.length.

Например, если numbers = {1,2,3,9} затем i будет 1, 2, 3, 9. Но его длина равна 4, поэтому, когда вы зацикливаетесь на элементах внутри нее, вы пытаетесь сделать numbers[9], который превышает его размер.

Вы, вероятно, хотите System.out.print(i + ", ");

+1

Спасибо. Кратко и легко понять. –

5

for(int i = 0; i <= numbers.length; i++) должно быть

for(int i = 0; i < numbers.length; i++)

В Java, массивы 0 на основе индексации. Это означает, что ваш первый элемент должен быть доступен по индексу 0 и, очевидно, последний при длине вашего массива минус 1.

int tab[] = new int[3]; //tab of length 3 
tab[0] = 11; 
tab[1] = 24; 
tab[2] = 5; 

Здесь Вы получаете доступ к последнему элементу с помощью вызова tab[2] или tab[tab.length-1], что эквивалентно.


Извиняюсь, это была просто ошибка в коде я расфасованы в вопрос.

Проблема заключается в том, что вы должны сделать: System.out.print(i + ", "); Вы должны прочитать this и this о оптимизированное для цикла.

для постановки также имеет другую форму, предназначенную для итерации через коллекций и массивов Эта форма иногда упоминается как усовершенствованными для заявления, и могут быть использованы, чтобы сделать ваши петли более компактным и легким для чтения. Для того, чтобы продемонстрировать, рассмотрим следующий массив, который содержит числа от 1 до 10:

int[] numbers = {1,2,3,4,5,6,7,8,9,10}; 

Следующая программа, EnhancedForDemo, использует улучшенный в цикл через массив:

class EnhancedForDemo { 
    public static void main(String[] args){ 
     int[] numbers = 
      {1,2,3,4,5,6,7,8,9,10}; 
     for (int item : numbers) { 
      System.out.println("Count is: " + item); 
     } 
    } 
} 

В в этом примере переменная item содержит текущее значение из массива чисел.

Таким образом, item содержит текущее значение из массива чисел и не текущий индекс. Вот почему вы получаете IOOBE.

+3

Быстрое объяснение об индексировании на основе 0 сделало бы это отличным ответом! – christopher

+0

Извинения, это была просто ошибка в коде, который я поставил в вопросе. Это было сделано в первый раз. Он по-прежнему не объясняет, почему усиленный цикл не работает. Я отредактировал код вопроса, чтобы отразить это. –

2
for(int i : numbers) 
{ 
    System.out.print(numbers[i] + ", "); 
} 

должен быть

for(int i : numbers) 
    { 
     System.out.print(i + ", "); 
    } 

Вам не нужно использовать индексы в расширение для цикла.

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