2013-05-15 2 views
1

Я нашел вопрос в этой строке кода. Не обращайте внимания на то, что этот код не имеет смысла:Проверка всех условий в логической дизъюнкции

if (object != null || object.someMethod()) object.doSomething(); 

Сначала я думал, что этот код будет бросать NullPointerException если объект является недействительным. Но это логическая дизъюнкция, и если одно из условий верно, то все условие истинно. Поэтому компилятор не проверяет второе условие и не выбрасывает NullPointerException.

Является ли это стандартным поведением или реализацией Java-стандарта? Если второй случай верен, этот код не защищен.

+2

данный код ** будет ** бросать 'NullPointerException', если объект является' null': он должен быть '&&', чтобы предотвратить это –

ответ

0

Это стандартное поведение Java. Логический ИЛИ (||) является оператором «короткого замыкания», означающим, что он оценивает только то, что ему нужно, чтобы определить, является ли все условие истинным или нет. Если вы хотите, чтобы оценка каждого охранника использовалась |.

2

Когда объект не равен нулю, выполняется оценка короткого замыкания, и object.someMethod() никогда не вызывается.

Когда объект имеет значение null, это выражение должно вызывать исключение NullPointerException при оценке object.someMethod().

Это не особенно полезное условие. Подумайте, был ли вместо 0 = & &.

1

|| определен Java как оператор короткого замыкания. Поэтому, если первое условие равно true, оно не оценивает второе условие. Это отличается от оператора |, который НЕ является короткозамкнутым. Опора на операторах короткого замыкания является ОЧЕНЬ обычной практикой при кодировании Java.

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

0

someMethod может быть статическим методом, который возвращает true, даже если объект не существует. Компилятор должен предупредить вас.

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