0

好的,这是一个简单的问题,我对此没有任何问题,但我只是想确定一下。如果我这样做是正确的吗?

if (person != null && person.getAge > 20) {...}

我可以这样做吗?空检查和对象访问在同一行?这个对吗?或者我必须在空检查语句上做一个内部语句,例如:

if (person != null)
{
    if (person.getAge() > 20) {...}
}

imo,第一个语句不会抛出 NPE,但我需要专业人士的反馈......

一般来说,我的问题是,在带有 && 的 if 语句中,如果第一个布尔值为 false,JVM 会停止执行 if 语句还是会全部检查?

4

5 回答 5

5

是的。运算符&&||是所谓的短路运算符。这意味着一旦知道答案,从左到右阅读,条件中的其他语句就不会被评估。在您的情况下,只要person != nullpart 评估为false,无论其他语句如何,整个条件都将保证为 false ,因此person.getAge > 20不会被评估并且不会引发异常。类似地,如果您使用||,并且第一部分的计算结果为true,则不会计算第二部分,因为整体条件保证true在该点。

于 2014-02-04T20:19:17.063 回答
1

是的,你可以这么做。如果 person 为空,它会看到

if(person != null && otherBoolean  )

如果person != null是假的,那么不管是什么都没有关系otherBoolean,因为无论如何,表达式都会保证为假。

它首先计算最左边的表达式,所以如果你以另一个顺序来计算它,那是行不通的。


作为旁注,您可以通过以下方式轻松测试:

person = null;

if (person != null && person.getAge > 20) {...}
于 2014-02-04T20:18:31.980 回答
0

这被称为短路,这样做完全没问题。

if (person != null && person.getAge > 20) {...}

始终确保您进行null检查,并且&&只有在前一个条件是 时才会检查下一个条件true

在这种情况下person.getAge > 20,仅当person != nullis时才检查true


还要检查这个 SO 问题:Java 逻辑运算符短路

进一步阅读:避免 Java 中的“!= null”语句?

于 2014-02-04T20:18:34.017 回答
0
if (person != null && person.getAge > 20) {...}//good to go with that

当然,在这种情况下,如果 person 为 null,它不会评估 person.getAge > 20 所以你不会得到 NPE

阅读 java 中的 && 运算符肯定不会检查第二个值

于 2014-02-04T20:18:47.050 回答
0

if (person != null && person.getAge > 20) {...}

&&是短路逻辑与。因此如果person != null为假,person.getAge > 20将不会被评估。

&是不短路的逻辑与。如果使用if (person != null & person.getAge > 20)and为 null,则在评估person时会得到空指针异常。person.getAge > 20

于 2014-02-04T20:30:43.493 回答