2013-10-11 5 views
-36

Я использую сбор списков в Java, и я использую итерационную коллекцию для работы с созданным списком целых значений.Почему это бесконечный цикл?

Почему этот код получает бесконечную петлю?

int i = 0; 
int j = 0; 

List<Integer> li = new ArrayList<Integer>(); 

for (i = 0; i < 10; i++) { 
    li.add(i); 
} 

do { 
    System.out.println(li.get(j)); 
} while(j < li.size()); 
+5

Попробуйте добавить что-нибудь в j. –

+11

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

+1

Кстати, это сбой, если список пуст, потому что блок 'do' всегда выполняется * хотя бы один раз *. Просто используйте вместо этого цикл while. – ozgur

ответ

36

Вы забыли/пропустили увеличиваем переменную счетчика в do...while цикле.

j++ Кольцо любого колокола?

10

Это бесконечно, потому что вы никогда не меняете значение j - каждый раз, когда вы читаете первое значение от li. Коллекция List<> не удаляет элементы, когда вы их читаете. Вы должны искать коллекции Stack или Queue, если вам это нужно.

do { 
System.out.println(li.get(j)); 
j++; // you are missing this line 
} while(j < li.size()); 
14

Причина j всегда меньше, чем li.size()

5

Вы забыли увеличиваем переменную счетчика цикла (j)

5

Вы забыли увеличиваем (j++) Ваш j в пункте вашего dodo - while петля.

3

Если вы не увеличиваем ямайских условие

while(j < li.size()); 

всегда будет таким же

так держать j ++ в вашем втором цикле

do { 
System.out.println(li.get(j)); 
j++; 
} while(j < li.size()); 
4

Это потому, что у не выполняют любая операция приращения или уменьшения по значению «j». Таким образом, каждый раз, когда компилятор находит значение j как 0, и цикл работает для бесконечного цикла, потому что он находит условие do..while loop как true.

3

Вы должны прирастить переменную счетчика j. На данный момент j всегда меньше li.size()

3

Добавить j++ ниже

System.out.println(li.get(j)); 
3

Линия while(j < li.size()); проверяет, является ли значение j меньше, чем размер List

после j =0 и 0<10 (Which is your List size) всегда верно в результате код никогда не заканчивается и вы входите в бесконечный цикл. вы могли бы сделать что-то вроде этого

do { 
    System.out.println(li.get(j)); 
    j++; 
} while(j < li.size()); 
3

Вам необходимо увеличивать ИНТ j. Вы можете достичь этого, используя j++. Вы должны сделать это в своем цикле do..while, после вашей строки кода System.out.println(li.get(j));.

В противном случае j всегда будет меньше, чем размер вашего ArrayList li, а затем цикл будет выполняться бесконечно

3

Всегда увеличивают переменные в любом типе цикла, если вы хотите сравнить с максимальным значением. Чтобы проверить значение j меньше значения, в один момент времени вам необходимо выполнить его прирост в цикле do....while(). Так используйте

j++; 

в петле, то ваш цикл будет выполняться только до значения J становится больше, чем максимальное значение, которое вы хотите проверить его.

2

Вы пропустили обновление счетчик/итератор j в петле. Поскольку, j не обновляется, цикл бесконечно выполняется.

В результате вы получите то же значение, возвращаемое вызовом метода li.get(), поскольку переданный параметр всегда является одним и тем же значением.

Либо вы должны изменить значение j в теле цикла:

do { 
    System.out.println(li.get(j)); 
    ++j; //Add this change 
} while(j < li.size()); 

или

do { 
    System.out.println(li.get(j)); 
} while(++j < li.size()); //Add this change 
3

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

do 
{ 
    System.out.println(li.get(j)); 

    j++; //You missed this statement 

} 
while(j < li.size()); 
2

Первый цикл это хорошо, но в следующем цикле do_while, вы не увеличивать или индекс цикла обновления (J), именно поэтому второй цикл выполняется бесконечно.

int i = 0; 
int j = 0; 

List<Integer> li = new ArrayList<Integer>(); 

for (i = 0; i < 10; i++) { 
    li.add(i); 
} 

do { 
    System.out.println(li.get(j)); 
    j++; //increament loop index or you may use j+=1; 
} while(j < li.size()); 
0

J всегда 0. J инициализируется со значением 0 и никогда не обновляется

1

Вы устанавливаете J = 0, но она никогда не увеличивается, так что всегда будет ямайских < li.size().

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