Подтвердить что ты не робот

Булевский порядок выражения в Java?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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