条件OR运算符的短路行为(||)

时间:2012-04-15 18:47:20

标签: java operators

条件运算符&&和||按照中的要求进行短路 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html,这意味着第二个操作数有时不需要进行评估。

有人可以提供一个示例,其中条件OR(||)运算符会被短路吗?

使用条件AND(&&)运算符,短路行为非常简单:

if(false&&(1> 0))然后第二个操作数:(1> 0)不需要被评估,但似乎无法找到/想到条件的一个例子-要么。

3 个答案:

答案 0 :(得分:18)

当第一个操作数为真时,或运算符被短路。所以,

String foo = null;
if (true || foo.equals("")) {
    // ...
}

不会抛出NullPointerException

正如@prajeesh在评论中正确指出的那样,在实际代码中使用短路的方法是在处理可能返回null的API时阻止NullPointerException。因此,例如,如果有readStringFromConsole方法返回当前可用的字符串,或者如果用户没有输入任何内容,则返回null,我们可以写

String username = readStringFromConsole();
while (username == null || username.length() == 0) {
    // No NullPointerException on the while clause because the length() call
    // will only be made if username is not null

    System.out.println("Please enter a non-blank name");
    username = readStringFromConsole();
}

// Now do something useful with username, which is non-null and of nonzero length

作为旁注,返回用户输入的API应该在用户未键入任何内容时返回空字符串,并且不应返回null。返回null是一种说“没有任何可用”的方式,而返回空字符串是一种说“用户没有输入任何内容”的方式,因此是首选。

答案 1 :(得分:1)

if(true || (0 > 1))

第一个陈述是正确的,因此没有必要评估第二个陈述。

答案 2 :(得分:1)

if (true || comparison)

永远不会评估比较,因为它的结果是无关紧要的(因为第一个参数已经是真的)。​​