Булевский порядок выражения в Java?
Предположим, что я имею следующее выражение
String myString = getStringFromSomeExternalSource();
if (myString != null && myString.trim().length() != 0) {
...
}
Eclipse предупреждает меня, что myString
может быть нулевым во второй фразе булевого выражения. Однако я знаю, что некоторые компиляторы полностью выходят из логического выражения, если первое условие выходит из строя. Это правда с Java? Или порядок оценки не гарантируется?
Ответы
Ответ 1
Однако я знаю, что некоторые компиляторы полностью выходят из логического выражения, если первое условие выходит из строя. Это правда с Java?
Да, это называется Оценка короткого замыкания. Операторы, такие как &&
и ||
, являются операторами, которые выполняют такие операции.
Или порядок оценки не гарантируется?
Нет, порядок оценки гарантирован (слева направо)
Ответ 2
Java должна оценивать ваши заявления слева направо. Он использует механизм, известный как оценка короткого замыкания, чтобы предотвратить тестирование второго, третьего и n-го условий, если первое ложно.
Итак, если ваше выражение myContainer != null && myContainer.Contains(myObject)
и myContainer
равно null, второе условие myContainer.Contains(myObject)
не будет оцениваться.
Изменить: Как уже упоминалось, Java, в частности, имеет как короткозамкнутые, так и некороткозамкнутые операторы для булевых условий. Использование &&
вызовет оценку короткого замыкания, а &
не будет.
Ответ 3
Джеймс и Эд верны. Если вы столкнулись с ситуацией, в которой вы хотели бы, чтобы все выражения были оценены независимо от предыдущих неудачных условий, вы можете использовать логический оператор без короткого замыкания &
.
Ответ 4
Да, Java использует ленивую оценку if-выражений таким образом. если myString == null, остальная часть оператора if не будет оцениваться