如果第一个条件为真,java会计算(test1 || test2)中的第二个条件吗?
我使用Optional,我有类似的东西:
if (!opt.isPresent() || opt.get() == currentPlayer.getSelectedRegion())
如果第一个测试为真且java计算第二个测试,则会出现问题。
答案 0 :(得分:3)
如果第一个条件为真,则不评估第二个条件。
如果第一个条件为假,则评估第二个条件。
这就是为什么你可以在没有NullPointerException
if (str == null || str.length() == 0) {
// do something
}
运营商|
(而非||
)将评估两个条件
所以代码
if (str == null | str.length() == 0) {
// do something
}
如果NullPointerException
为str
,可以生成null
答案 1 :(得分:2)
如果第一个条件为真,java会计算(test1 || test2)中的第二个条件吗?
没有。布尔或将短路,第一个true
足以使表达式true
。之后不再评估其他条件。
答案 2 :(得分:1)
不,java短截码运算符,如果第一个是第二个参数,则不进行评估。更正式:
x || y
,y
仅在x
为false
的情况下进行评估;和x && y
,x
仅在y
为true
的情况下进行评估。这会提高性能,既有用又棘手:
有用的:防止你做出引发错误的事情。最典型的例子是null
检查:
if(x != null && x.someTest())
如果.someTest
为x
,则会阻止null
被调用。
棘手:有问题的方面可能是,如果你调用的方法不仅会返回某些内容,还会更改状态。例如:
public class Foo {
private int checked = 0;
bool someCondition () {
return (checked % 2) == 0;
}
bool neverChecked () {
checked++;
return checked == 1;
}
}
如果你现在打电话:
if(foo.someCondition() || foo.neverChecked());
这是建议保持" getters"的主要原因之一。 (认为计算对象的东西)," setters" (修改对象状态的东西),明显分开。从你开始混音的那一刻起,在某些情况下可能会出现复杂的行为。
您可以随意增加checked
,但只有当.someCondition
恰好为false
时才会增加。
答案 3 :(得分:1)
如果您使用||
和&&
,而不是|
和&
,Java将无需评估右侧操作数。