【问题标题】:How java test conditions [duplicate]java如何测试条件[重复]
【发布时间】:2015-12-20 21:35:02
【问题描述】:
如果第一个条件为真,java 是否计算 (test1 || test2) 中的第二个条件?
我使用 Optional 并且我有类似的东西:
if (!opt.isPresent() || opt.get() == currentPlayer.getSelectedRegion())
如果第一个测试为真,java 计算第二个测试,就会出现问题。
【问题讨论】:
标签:
java
boolean
conditional-statements
【解决方案1】:
如果第一个条件为真,java 是否计算 (test1 || test2) 中的第二个条件?
没有。布尔值或将短路,第一个true 足以使表达式true。之后将不再评估其他条件。
【解决方案2】:
如果第一个条件为真,则不评估第二个条件。
如果第一个条件为假,则评估第二个条件。
这就是为什么你可以在没有NullPointerException的情况下编写如下代码
if (str == null || str.length() == 0) {
// do something
}
运算符|(而不是||)将评估这两个条件
所以代码
if (str == null | str.length() == 0) {
// do something
}
如果str 是null,则可以生成NullPointerException
【解决方案3】:
不,java 快捷操作符,如果第一个参数是,则不计算第二个参数。更正式的:
- 对于
x || y,仅当x 为false 时才评估y;和
- 对于
x && y,仅当y 为true 时才评估x。
这将提高性能,既有用又棘手:
-
有用:防止你做一些会引发错误的事情。最典型的例子是null检查:
if(x != null && x.someTest())
如果x 是null,这将防止.someTest 被调用。
-
棘手:如果您调用的方法不仅返回某些内容,而且还会更改状态,则可能会出现问题。例如:
public class Foo {
private int checked = 0;
bool someCondition () {
return (checked % 2) == 0;
}
bool neverChecked () {
checked++;
return checked == 1;
}
}
如果你现在打电话:
if(foo.someCondition() || foo.neverChecked());
这是建议将“getter”(认为计算对象的事物)和“setter”(修改对象状态的事物)明确分开的主要原因之一。从你开始混音的那一刻起,在某些情况下你的行为就会变得复杂。
这可能是您始终递增checked 的意图,但只有当.someCondition 恰好是false 时才会递增。
【解决方案4】:
如果您使用|| 和&&,而不是| 和&,Java 将不会费心计算右手操作数。