Проверка Java на объекте
Хорошо, это простой вопрос, у меня нет проблем с этим, но я просто хочу быть уверен. Это правильно, если я сделаю что-то подобное?
if (person != null && person.getAge > 20) {...}
я могу это сделать? нулевая проверка и доступ к объекту на одной строке? это правильно? или я должен сделать внутреннее утверждение о пустом утверждении проверки как:
if (person != null)
{
if (person.getAge() > 20) {...}
}
IMO, первое заявление не будет бросать NPE, но мне нужны отзывы от профессионалов...
Как правило, мой вопрос заключается в том, что если в операторах if с &&, если первый логический параметр равен false, JVM прекратит выполнение оператора if или проверит все это?
5 ответов
Да. Операторы &&
а также ||
это то, что известно как операторы короткого замыкания. Это означает, что, как только ответ известен, читая слева направо, другие операторы в условии не оцениваются. В вашем случае, как только person != null
часть оценивает false
, все условие будет гарантированно ложным независимо от других утверждений, поэтому person.getAge > 20
не будет оцениваться и не будет генерировать исключение. Точно так же, если вы используете ||
и первая часть оценивает true
вторая часть не будет оцениваться, потому что общее условное условие гарантированно будет true
в таком случае.
Да, вы можете сделать это. если человек ноль, он увидит
if(person != null && otherBoolean )
если person != null
ложно, чем неважно, что otherBoolean
есть, потому что выражение гарантированно будет ложным, несмотря ни на что.
Сначала он вычисляет крайнее левое выражение, поэтому, если вы располагаете его в другом порядке, это не сработает.
В качестве примечания вы можете легко проверить это, написав:
person = null;
if (person != null && person.getAge > 20) {...}
if (person != null && person.getAge > 20) {...}//good to go with that
Конечно, в этом случае, если человек нулевой, он не будет оценивать person.getAge > 20, поэтому вы не получите NPE
Читайте об операторе && в java, конечно, он не проверит второе значение
Это называется коротким замыканием, и это прекрасно.
if (person != null && person.getAge > 20) {...}
Всегда убедитесь, что вы делаете null
проверить и &&
переместится, чтобы проверить следующее условие, только если предыдущее true
,
В этом случае person.getAge > 20
проверяется только если person != null
является true
,
Также проверьте этот вопрос SO: Короткое замыкание логического оператора Java
Для дальнейшего чтения: Избегать операторов "!= Null" в Java?
if (person != null && person.getAge > 20) {...}
&&
Короткое замыкание логическое И. Таким образом, если person != null
ложно, person.getAge > 20
не будет оцениваться.
&
логично И это не короткое замыкание. Если вы используете if (person != null & person.getAge > 20)
а также person
NULL, вы получите исключение нулевого указателя, когда person.getAge > 20
оценивается.