两个条件运算& &和行为||短路按照
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html,这意味着第二个操作数不需要在时间进行评估。短路条件OR运算符(||)
可能有人请提供一个例子,其中有条件OR(||)运算符是短路?
的短路行为是与条件-AND(& &)操作非常简单,如:
如果(假& &(1> 0)),则第二个操作数:(1> 0)将不需要评估,但似乎无法找到/想象一个条件OR的例子。
两个条件运算& &和行为||短路按照
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html,这意味着第二个操作数不需要在时间进行评估。短路条件OR运算符(||)
可能有人请提供一个例子,其中有条件OR(||)运算符是短路?
的短路行为是与条件-AND(& &)操作非常简单,如:
如果(假& &(1> 0)),则第二个操作数:(1> 0)将不需要评估,但似乎无法找到/想象一个条件OR的例子。
if(true || (0 > 1))
第一条语句是真实的,所以它是没有必要的评估第二。
的或操作者被短路时,第一操作数是真实的。所以,
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是一种说“没有任何可用”的方式,而返回空字符串是一种说“用户没有输入任何内容”的方式,因此是首选。
我没有得到这种具体的'真实||的情况foo.equals(“”)使得事物显得合乎逻辑,它应该是'if(foo == null || foo.equals(“”))'当'foo'为空时将短路,从而阻止NPE 。 – 2012-04-15 18:59:08
if (true || comparison)
比较永远不会被评估,因为它的结果是不相关的(因为第一个参数已经是真的)。
当第一个操作数的结果可以定义逻辑操作的结果时,会发生短路。对于'&&'第一个变成'false'肯定会使结果'false',对于'||'第一个变为真会使结果'true'确定。因此,第一个操作数是“真”,将总是为'||'操作符短路。 – 2012-04-15 19:02:16
为什么用||更简单?它与&&完全一样简单。当整个条件的值已知时停止表达式的计算。表达式从左到右进行评估。 – 2012-04-15 19:23:17
@MichaelSchmeißer:对不起,我不知道我是如何错过它的直截了当。 – Vivek 2012-04-15 21:06:39