Булевы выражения порядок оценки в Java? - PullRequest
27 голосов
/ 08 января 2010

Предположим, у меня есть следующее выражение

String myString = getStringFromSomeExternalSource();
if (myString != null && myString.trim().length() != 0) {
...
}

Eclipse предупреждает меня, что myString может быть нулевым во второй фразе логического выражения. Однако я знаю, что некоторые компиляторы будут полностью выходить из логического выражения, если первое условие не выполнено. Это правда с Java? Или порядок оценки не гарантируется?

Ответы [ 4 ]

45 голосов
/ 08 января 2010

Однако я знаю, что некоторые компиляторы будут полностью выходить из логического выражения, если первое условие не выполнено. Это правда с Java?

Да, это называется Оценка короткого замыкания . Такие операторы, как && и ||, являются операторами, которые выполняют такие операции.

Или порядок оценки не гарантирован?

Нет, порядок оценки гарантирован (слева направо)

7 голосов
/ 08 января 2010

Java должна оценивать ваши утверждения слева направо. Он использует механизм, известный как оценка короткого замыкания , чтобы предотвратить тестирование второго, третьего и n-го условий, если первое неверно.

Итак, если ваше выражение myContainer != null && myContainer.Contains(myObject) и myContainer равно нулю, второе условие myContainer.Contains(myObject) не будет оцениваться.

Редактировать: Как уже упоминалось, Java, в частности, имеет операторы как короткого, так и не короткого замыкания для логических условий. Использование && вызовет оценку короткого замыкания, а & - нет.

2 голосов
/ 08 января 2010

Джеймс и Эд правы. Если вы сталкиваетесь со случаем, когда вы хотите, чтобы все выражения оценивались независимо от предыдущих неудачных условий, вы можете использовать логический оператор без короткого замыкания &.

1 голос
/ 08 января 2010

Да, Java практикует ленивую оценку операторов if таким образом. if myString == null, остальные инструкции if не будут оцениваться

...