2012-04-15 27 views
11

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

可能有人请提供一个例子,其中有条件OR(||)运算符是短路?

的短路行为是与条件-AND(& &)操作非常简单,如:

如果(假& &(1> 0)),则第二个操作数:(1> 0)将不需要评估,但似乎无法找到/想象一个条件OR的例子。

+1

当第一个操作数的结果可以定义逻辑操作的结果时,会发生短路。对于'&&'第一个变成'false'肯定会使结果'false',对于'||'第一个变为真会使结果'true'确定。因此,第一个操作数是“真”,将总是为'||'操作符短路。 – 2012-04-15 19:02:16

+1

为什么用||更简单?它与&&完全一样简单。当整个条件的值已知时停止表达式的计算。表达式从左到右进行评估。 – 2012-04-15 19:23:17

+0

@MichaelSchmeißer:对不起,我不知道我是如何错过它的直截了当。 – Vivek 2012-04-15 21:06:39

回答

1
if(true || (0 > 1)) 

第一条语句是真实的,所以它是没有必要的评估第二。

15

的或操作者被短路时,第一操作数是真实的。所以,

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是一种说“没有任何可用”的方式,而返回空字符串是一种说“用户没有输入任何内容”的方式,因此是首选。

+1

我没有得到这种具体的'真实||的情况foo.equals(“”)使得事物显得合乎逻辑,它应该是'if(foo == null || foo.equals(“”))'当'foo'为空时将短路,从而阻止NPE 。 – 2012-04-15 18:59:08

1
if (true || comparison) 

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