如何java测试条件

时间:2015-09-23 14:01:38

标签: java boolean conditional-statements

如果第一个条件为真,java会计算(test1 || test2)中的第二个条件吗?

我使用Optional,我有类似的东西:

if (!opt.isPresent() || opt.get() == currentPlayer.getSelectedRegion())

如果第一个测试为真且java计算第二个测试,则会出现问题。

4 个答案:

答案 0 :(得分:3)

如果第一个条件为真,则不评估第二个条件。

如果第一个条件为假,则评估第二个条件。

这就是为什么你可以在没有NullPointerException

的情况下编写如下代码的原因
if (str == null || str.length() == 0) {
     // do something
}

运营商|(而非||)将评估两个条件

所以代码

if (str == null | str.length() == 0) {
     // do something
}
如果NullPointerExceptionstr

可以生成null

答案 1 :(得分:2)

  

如果第一个条件为真,java会计算(test1 || test2)中的第二个条件吗?

没有。布尔或将短路,第一个true足以使表达式true。之后不再评估其他条件。

答案 2 :(得分:1)

不,java短截码运算符,如果第一个是第二个参数,则不进行评估。更正式:

  • 代表x || yy仅在xfalse的情况下进行评估;和
  • 仅针对x && yx仅在ytrue的情况下进行评估。

这会提高性能,既有用又棘手:

  • 有用的:防止你做出引发错误的事情。最典型的例子是null检查:

    if(x != null && x.someTest())
    

    如果.someTestx,则会阻止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将无需评估右侧操作数。