2015-03-08 6 views
1

У меня есть фрагмент кода, который включает в себя два условия для ввода времени цикла, но я смущен от выхода и ожидаемого результата из следующего кода:во время оценки состояния цикла

while (curr != null && key.compareTo(curr.getKey()) > 0) { 
    prev = curr; 
    curr = prev.getNext(); 
    if (curr == null) { 
    System.out.println(curr + " is null"); 
    } 
} 

Когда я запустил этот код, Я ожидал, что он выбросит исключение с нулевым указателем, так как curr имеет значение null, и я вызываю метод на null, после того, как сообщение распечатано, однако оно выходит из цикла нормально, и мне было интересно, нормальное поведение? Отсюда кажется, что он оценивает одно условие за раз, но я думал, что в то время как циклы оценивают все внутри скобки в одном булевом выражении?

Я проверил один тест, где я поменял операнды на & & наоборот и обнаружил, что он выбрасывает исключение нулевого указателя! Что является причиной этого?

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

+1

Обратите внимание, что это не что иное, для работы с while-loop. Правила оценки '&&' одинаковы для условия if, присваивания результата булевой переменной и т. Д. –

ответ

4

&& является оператором короткого замыкания (или короткой стрелки). Он будет оценивать первое условие, и если условие истинно, тогда только будет оценивать второе условие.

Так что если мое состояние conditon1 && condition2, оно будет оценивать условие2 тогда и только тогда, когда условие1 истинно.

Итак, в вашем случае он будет оценивать не нулевое состояние (curr != null), и если он не сработает, он не оценит другой и, следовательно, не будет исключать NullPointerException и, следовательно, вы увидите, что цикл будет изящно издан.

+0

Вау, я этого не знал; Я все время думал, что условия должны быть оценены как целые. – Nubcake

0
(curr != null && key.compareTo(curr.getKey()) 

& & гарантирует, что левый правда перед запуском права

& & и || операторы «короткого замыкания», то есть они не оценивают правую сторону, если это не обязательно.

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

Вот очень хорошее объяснение этого Java logical operator short-circuiting

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

false && ... - it is not necessary to know what the right hand side is, the result must be false 
true || ... - it is not necessary to know what the right hand side is, the result must be true 
Смежные вопросы