&&(AND)和|| (或)在IF声明中

问题

我有以下代码:

if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){  
    partialHits.get(z).put(z, tmpmap.get(z));  
}

wherepartialHits是一个HashMap。
**如果第一个陈述是真的,会发生什么?****Java还会检查第二个语句吗?**因为第一个语句的顺序为真,HashMap不应该包含给定的键,所以如果选中第二个语句,我将得到NullPointerException
所以简单来说,如果我们有以下代码

if(a && b)  
if(a || b)

在第一种情况下Java checkbifa是假的吗?在第二种情况下ifa是真的吗?


#1 热门回答(169 赞)

不,它不会被评估。这非常有用。例如,如果你需要测试String是否为空或空,你可以编写:

if (str != null && !str.isEmpty()) {
  doSomethingWith(str.charAt(0));
}

或者,相反

if (str == null || str.isEmpty()) {
  complainAboutUnusableString();
} else {
  doSomethingWith(str.charAt(0));
}

如果我们在Java中没有"短路",我们会在上面的代码行中收到很多NullPointerExceptions。


#2 热门回答(57 赞)

Java有5种不同的布尔比较运算符:&,&&,|,||,^

&和&&是"和"运算符,|和|| "或"运算符,^是"xor"

在检查参数值之前,单个参数将检查每个参数,而不考虑值。双击将首先检查左参数及其值,iftrue(||)或false(&&)保持第二个不变。声音是否合并?一个简单的例子应该说清楚:
给出所有例子:

String aString = null;

和:

if (aString != null & aString.equals("lala"))

在评估完成之前检查这两个参数,并为第二个参数抛出NullPointerException。

if (aString != null && aString.equals("lala"))

检查第一个参数并返回false,因此不会检查第二个参数,因为结果是false

OR的相同:

if (aString == null | !aString.equals("lala"))

也会引发NullPointerException。

if (aString == null || !aString.equals("lala"))

检查第一个参数并返回true,因此不会检查第二个参数,因为结果是3852218585。

XOR无法优化,因为它取决于两个参数。


#3 热门回答(27 赞)

不,它不会被检查。此行为称为short-circuit evaluation,是包括Java在内的多种语言的功能。