Java: выполнить для оператора, пока данная переменная не достигла определенного значения? - PullRequest
1 голос
/ 25 октября 2011

Я хочу иметь оператор for, который повторяется до тех пор, пока данный int не достигнет определенного значения.

Например ...

for (int variable = 0; variable < other_variable; variable++) {

Проблема в том, что оператор for никогда не закончится. Это будет продолжаться бесконечно. Что я сделал не так?

Это мой код ...

boolean itemexist_check = false;
do {
    int i2 = m_area.m_items.size();

    for (int i = 0; i < i2; i++) {
        String s2 = m_area.m_items.get(i).returnName();
        System.out.println("Checking...");

        if (s2.contains(s)) {
            System.out.println("You take the " + s2 + ".");
            itemexist_check = true;
            player.addItem(m_area.m_items.get(i));
            m_area.m_items.remove(i);
        }
        else {
            //do nothing, repeat loop
        }
    } 
}
while (itemexist_check == false);

В этом коде m_area.m_items.size() вернет 1, поэтому i2 будет 1.

Ответы [ 4 ]

4 голосов
/ 25 октября 2011

Существует несколько возможностей:

  1. вы меняете variable внутри тела цикла;
  2. вы меняете other_variable внутри тела цикла;
  3. other_variable установлено на большое значение, в этом случае цикл может занять много времени для завершения;
  4. ваш код никогда не завершает определенную итерацию цикла, например:
    • он застревает во вложенном цикле, как предложено @ Eng.Fouad в комментариях, или
    • ожидает блокировки, или
    • блокирует вызов ввода-вывода, который никогда не будетзавершается (или занимает много времени) и т. д.

Не зная типичного значения other_variable и не видя тела цикла, можно только догадываться.

0 голосов
/ 25 октября 2011

Конечно, цикл do/while не заканчивается? Этот цикл for не может работать вечно.

0 голосов
/ 25 октября 2011

На заметку,

Строка s2 = m_area.m_items.get (i) .returnName ();

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

m_area.m_items.remove (я);

вызывается, потому что каждый раз, когда вызывается m_area.m_items.remove(i), список / массив теряет элемент, а его размер уменьшается, что никогда не отражается при проверке границы итерации.

0 голосов
/ 25 октября 2011

Вы должны попробовать цикл

do {


}while(condition is true)

.Тем не менее, вы должны реализовать проверки, предполагая, что будут отсутствующие данные или условия, приводящие к бесконечному циклу.Просто мои 2 цента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...