当 Java 计算连词 (&&) 时,如果 exp1 为 false,它会计算 exp2 吗?
我想知道是否可以保证在 Java 程序中,只要左侧的表达式 (exp1) 计算结果为 false,连词右侧的布尔表达式 (上面的 exp2) 就不会被计算。我想知道,因为我有一个如下所示的表达式:
if (var != null && var.somePredicate())
// do something
如果 Java 在看到 后不能保证停止计算
为 null,那么它可能会尝试计算 (var != null && var.somePredicate())
varvar.somePredicate()
,这会抛出 NullPointerException。
所以我的问题是,Java 是否能保证某种行为?或者这样写会更安全
if (var != null)
{
if (var.somePredicate())
// do something
}
I'm wondering if it's guaranteed that in a Java program, the boolean expression on the right of a conjunction (exp2 above) will NOT be evaluated as long as the expression on the left (exp1) evaluated to false. I'm wondering because I have an expression like the following:
if (var != null && var.somePredicate())
// do something
If Java is not guaranteed to stop evaluating (var != null && var.somePredicate())
after it sees that var
is null, then it may try to evaluate var.somePredicate()
which would throw a NullPointerException.
So my question is, does Java guarantee a certain behavior when it comes to this? Or would it be safer to write
if (var != null)
{
if (var.somePredicate())
// do something
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
根据 Java 语言规范,15.23 条件- 和运算符&&:
因此,语言规范保证如果左侧为 false,则不会评估表达式的右侧。
From the Java Language Specification, 15.23 Conditional-And Operator &&:
So the language spec guarantees that the right-hand side of your expression will not be evaluated if the left hand side is false.
不,java 使用短路评估。如果
expr1
为false
,则不会评估expr2
,因此您的&&
使用是完全安全的。另外,如果您有
if (exp1 || exp2) { .. }
- 如果exp1
为true,则不会评估
。exp2
No, java uses Short circuit evaluation. If
expr1
isfalse
,expr2
will not be evaluated, thus your&&
usage is perfectly safe.Also, if you have
if (exp1 || exp2) { .. }
-exp2
will not be evaluated ifexp1
istrue
.让我们通过直接查看从此示例代码生成的操作码来执行我们自己的实验:
javap -v
生成:对于我的小程序,相关操作码是
ifeq
。它们检查变量是否等于 0,如果在本例中为操作码 23,则向前跳转一定数量的操作。因此,如果第一个ifeq
计算结果为 false,它将跳转经过第二个ifeq
指令直接进入 else 语句。这称为短路评估。
Let us perform our own experiment by looking directly at the opcodes that are generated from this sample code:
javap -v
generates:The relevant opcodes are
ifeq
for my small program. They check to see if the variables are equal to 0, and jump a certain number of operations forward if they are, in this case, to opcode 23. So if the firstifeq
evaluates to false it will jump past the secondifeq
instruction straight to the else statement.This is called short circuit evaluation.
如果您使用 &&或 ||,java 将使用短路求值(即,除非需要,否则不求值第二个表达式
)或 |,java 将始终计算第二个表达式,即使第一个表达式为 true
If you use && or ||, java will use short-circuit evaluation (ie not evaluate the second expression unless it needs to)
If you use & or |, java will always evaluate the second expression, even if the first was true
这是安全的,Java 会进行短路评估。
That's safe, Java does short circuit evaluations.