当Java计算一个连词(<boolean exp1> && <boolean exp2>)时,如果exp1为false,它是否eval exp2?

Tim*_*Tim 3 java evaluation conditional expression boolean

我想知道是否保证在Java程序中,只要左边的表达式(exp1)计算为false,就不会计算连接右边的布尔表达式(上面的exp2).我想知道因为我有一个如下表达式:

if (var != null && var.somePredicate())
   // do something
Run Code Online (Sandbox Code Playgroud)

如果Java (var != null && var.somePredicate())在看到varnull 之后不能保证停止计算,那么它可能会尝试评估var.somePredicate()哪个会抛出NullPointerException.

所以我的问题是,Java在这方面是否保证了某种行为?或者写起来会更安全

if (var != null)
{
   if (var.somePredicate())
      // do something
}
Run Code Online (Sandbox Code Playgroud)

ska*_*man 6

从Java语言规范,15.23条件和运算符&&:

&&运营商像&(§15.22.2),但评估其右边的操作数只有在其左侧操作数的值是true.

因此语言规范保证如果左侧是假的,则不会评估表达式的右侧.


ami*_*mit 5

否,java使用短路评估。如果expr1falseexpr2将不会被评估,因此您的&&使用是绝对安全的。

此外,如果您拥有if (exp1 || exp2) { .. }- exp2如果exp1是,则不会进行评估true