2017-02-11 2 views
-6

Я новичок в Java, я написал код на практике петли, и вот это:В чем причина этого бесконечного цикла?

public class scratch { 

    public static void main(String args[]) { 

     int value = 0; 
     boolean myBoolean = (value < 5); 

     while(myBoolean) { 

      System.out.println(value); 
      value = value + 1; 
     } 
    } 
} 

Когда я бегу, я получаю бесконечный цикл, но если я изменить «а» аргумент, как это:

public class scratch { 

    public static void main(String args[]) { 

     int value = 0; 
     boolean myBoolean = (value < 5); 

     while(value < 5) { 

      System.out.println(value); 
      value = value + 1; 
     } 
    } 
} 

это работает, и вот результат:

0 
1 
2 
3 
4 

Можете ли вы сказать мне, что я здесь отсутствует, спасибо!

+4

Не делает ли этот небольшой эксперимент достаточно ясно, что ваша логическая переменная get оценивается один раз и не заботится о том, как она была инициализирована (т. Е. Она не обновляется при изменении значения)? Что непонятно? – Tom

+1

В первом случае значение 'myBoolean' не изменяется при изменении' value'. Это не во втором случае, но это не имеет значения, потому что вы никогда не используете его значение. –

+0

Boolean = 0 <5 всегда – SaggingRufus

ответ

1

Вы сусло также переоценивать выражение boolean, чтобы установить значение в теле цикла для того, чтобы работать, как

final int LIMIT = 5; // <-- try to avoid magic numbers. 
boolean myBoolean = (value < LIMIT); // <-- assigns the result of the expression 
            // `value < LIMIT` to `myBoolean`. 
while(myBoolean) { 
    System.out.println(value); 
    value = value + 1; // <-- value++; 
    myBoolean = (value < LIMIT); 
} 

без этой последней строки обновляя myBoolean, когда myBoolean is true будет всегда be true.

+0

Что вы подразумеваете, избегая магических чисел? И почему вы использовали переменную LIMIT вместо того, чтобы просто писать 5? Спасибо! –

0

В вашем первом примере вы только установили «myBolean» один раз и никогда больше не меняете это значение. Вот почему ваша петля работает бесконечно.

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

Если вы переместили эту привязку в свою петлю, она тоже сработает.

public class scratch { 

public static void main(String args[]) { 
    int value = 0; 
    boolean myBoolean = true; 
    while(myBoolean) { 
     System.out.println(value); 
     value = value + 1; 
     myBoolean = (value < 5); 
    } 
} 

}

+0

В * обоих * примерах 'myBoolean' устанавливается только один раз. –

+0

Ох .. перепробовал это. Твое право. –

0

Причина проста, в первом случае

public class scratch { 

    public static void main(String args[]) { 

     int value = 0; 
     boolean myBoolean = (value < 5); 

     while(myBoolean) { 

      System.out.println(value); 
      value = value + 1; 
     } 
    } 
} 

Вы настраиваете логическую переменную быть boolean myBoolean = (value < 5);, что верно, как значение на ноль. и вы не меняется, что позже, так что вы в конечном итоге в бесконечном цикле

В то время как во втором случае

public class scratch { 

    public static void main(String args[]) { 

     int value = 0; 
     boolean myBoolean = (value < 5); 

     while(value < 5) { 

      System.out.println(value); 
      value = value + 1; 
     } 
    } 
} 

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

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