17

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

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

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

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

4

3 回答 3

22

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

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

不抛出NullPointerException.

正如@prajeesh 在评论中正确指出的那样,在实际代码中使用短路的方式是为了防止NullPointerException在处理可能返回 null 的 API 时出现。因此,例如,如果有一个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 是一种表示“没有可用的东西”的方式,而返回空字符串是一种表示“用户没有键入任何内容”的方式,因此是首选。

于 2012-04-15T18:49:17.050 回答
1
if (true || comparison)

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

于 2012-04-15T18:51:03.650 回答
1
if(true || (0 > 1))

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

于 2012-04-15T18:49:12.060 回答