好吧,这是一个简单的问题,我没有任何问题,但我只想确定。如果我做这样的事情,这是正确的吗?
if (person != null && person.getAge > 20) {...}
我能这样做吗?在同一行上进行null检查和对象访问?它是否正确?或者我必须在null检查语句上做一个内部语句,如:
if (person != null)
{
if (person.getAge() > 20) {...}
}
imo,第一个声明不会引发NPE,但我需要专业人士的反馈......
一般来说,我的问题是,如果带有&&的if语句,如果第一个布尔值为false,JVM是否会停止执行if语句,或者它会检查所有语句?
答案 0 :(得分:5)
是。运算符&&
和||
是所谓的短路运算符。这意味着一旦知道答案,从左到右阅读,就不会评估条件中的其他语句。在您的情况下,只要person != null
部分评估为false
,无论其他语句如何,整个条件都将保证为假,因此person.getAge > 20
将不会被评估且不会抛出一个例外。同样,如果您使用||
,并且第一部分评估为true
,则不会评估第二部分,因为此时整体条件保证为true
。
答案 1 :(得分:1)
if(person != null && otherBoolean )
如果person != null
为假,则与otherBoolean
无关,因为无论如何,表达式都将保证为假。
它首先评估最左边的表达式,所以如果你以其他顺序使用它,那就行不了。
作为附注,您可以通过编写以下内容轻松测试:
person = null;
if (person != null && person.getAge > 20) {...}
答案 2 :(得分:0)
它被称为短路,这样做非常好。
if (person != null && person.getAge > 20) {...}
始终确保您进行null
检查,&&
只有在前一个条件为true
时才会检查下一个条件。
在这种情况下,只有在person.getAge > 20
为person != null
时才会true
进行检查。
答案 3 :(得分:0)
if (person != null && person.getAge > 20) {...}//good to go with that
当然,在这种情况下,如果此人为空,则不会评估person.getAge> 20所以你不会得到NPE
了解&& java中的运算符肯定不会检查第二个值
答案 4 :(得分:0)
if (person != null && person.getAge > 20) {...}
&&
是短路逻辑AND。因此,如果person != null
为false,则不会评估person.getAge > 20
。
&
是逻辑上的,不会短路。如果使用if (person != null & person.getAge > 20)
且person
为null,则在评估person.getAge > 20
时将获得空指针异常。