好的,我正在构建程序以检查许多字段。如果至少有1个字段不正常,那么我不希望我的程序花时间检查其他字段。那么看看这段代码:
// Util.isReadyToUse method return true if the string is ready for using, & return false if it is not.
boolean isOK=true;
if(!Util.isReadyToUse(firstName)){
isOK=false;
}
else if(isOK && !Util.isReadyToUse(lastName)){
isOK=false;
}
else if(isOK && !Util.isReadyToUse(email)){
isOK=false;
}
.....more checking
if(isOK) {
//do sthing
}
好的,在运行时,程序将首先检查!Util.isReadyToUse(firstName)
。假设它返回(isOK = false)。接下来,该程序将检查isOK && !Util.isReadyToUse(lastName)
。
所以我的问题是,由于isOK
目前为假,那么程序是否会花时间在!Util.isReadyToUse(lastName)
之后检查条件&&
?
好的,作为一个人,如果您看到isOK=false
,现在看到isOK && !Util.isReadyToUse(email)
,那么您不想浪费时间来查看!Util.isReadyToUse(email)
,因为isOK = false你在&&
之后看到isOK
。
机器也能这样工作吗?
我正在考虑使用break
,但为什么人们说break
在if语句中不起作用:
if(!Util.isReadyToUse(firstName)){
isOK=false;
break;
}
else if(isOK && !Util.isReadyToUse(lastName)){
isOK=false;
break;
}......
在这种情况下,最佳解决方案是什么?
答案 0 :(得分:7)
所以我的问题是,既然isOK目前是假的,那么就会 该计划花时间检查病情 !&&?
之后的Util.isReadyToUse(lastName)
Java非常聪明,如果您的条件为if(somethingFlase && something)
,则something
因Short-circuit evaluation而无法联系到false
。由于整个表达式都是if(a && b)
而不管第二个条件如何,因此Java无需对其进行评估。
来自15.23. Conditional-And Operator &&:
如果结果值为false,则条件的值为 表达式为false,右侧操作数表达式不是 评价即可。如果左侧操作数的值为true,则评估右侧表达式。
a
- 如果false
为b
,则if(a && b)
不会被检查。 a
- 如果true
为b
,则会检查false
,因为如果它是false
,则表达式为{{} 1}}。if(a || b)
- 如果a
为true
,则b
不会被检查,因为无论如何这都是true
。if(a || b)
- 如果a
为false
,则会检查b
,因为如果b
为true
,那么它就会被true
是{{1}}。答案 1 :(得分:2)
不,它会快速删除谓词的其余部分。
你会看到像
这样的东西if(A != null && A.SomeVal == someOtherVal)
答案 2 :(得分:1)
Java支持所谓的短路评估。见本页:
http://en.wikipedia.org/wiki/Short-circuit_evaluation
这意味着如果语句中的第一个布尔值足以满足该语句,则跳过其余值。如果我们有以下内容:
boolean a = false;
boolean b = true;
if(a && b) /*Do something*/;
永远不会检查'b',因为'a'的false值足以打破if语句。
话虽如此,您的程序永远不会利用这一点,因为唯一的isOK
设置为false是在else if
个语句中。
答案 3 :(得分:1)
正如其他响应者所说,Java会做出聪明的事情。
但是你可能希望Java继续检查,在这种情况下你可以使用& vs&&或者vs ||。
if (someMethod() | anotherMethod() {
如果第一种方法retricns为true,Java仍然会执行第二种方法。
if (someMethod() & anotherMethod() {
如果第一个方法为false,Java仍将执行第二个方法。
答案 4 :(得分:1)
不,Java不会“浪费时间”。它被称为short circuit evaluation。
这种机制通常用于例如用于空检查:
if (foo != null && foo.neverFailsWithNPE()) {
// ...
}
答案 5 :(得分:0)
你不需要在if..else if ... else语句中使用break,因为一旦找到一个为真的条件,其余的甚至都不会被查看。