当前位置: 首页 > 面试题库 >

当Java评估一个连词( && ),如果exp1为假,它是否为eval exp2?

令狐昂雄
2023-03-14
问题内容

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

if (var != null && var.somePredicate())
   // do something

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

所以我的问题是,Java是否保证一定的行为?还是写起来更安全

if (var != null)
{
   if (var.somePredicate())
      // do something
}

问题答案:

从Java语言规范15.23 Conditional-
And运算符&&

&&运算符类似于&(§15.22.2),但 仅当其左侧操作数的值为true时,才对其右侧操作数求值

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



 类似资料:
  • 问题内容: 我知道Java在这种情况下具有智能/惰性评估: 但是关于: 即使返回true 也被调用? 问题答案: 在Java(和其他类似C的语言)中,这称为 短路评估 。* 是的,在第二个示例中总是被调用。也就是说,除非编译器/ JVM可以确定它没有可观察到的副作用,否则在这种情况下它可以选择进行优化,但是无论如何您都不会注意到它们之间的差异。 两者截然不同; 前者本质上是一种优化技术,而第二种则

  • 我正在使用Spring WebFlow 2.5.0,但是我的SpEL表达式没有得到正确的计算。我想我一定是做了什么与我的WebFlow配置或SpEL错误,但我不确定哪个。 我的登录流中有以下决策状态。xml: 但是,即使我的方法返回一个Event.success(),我也从未转换到状态。测试结果似乎总是错误的。 是我的SpEL错了,还是我做评估/测试的方式错了?如何调试SpEL评估以查看发生了什么

  • 问题内容: 字符串部分是: 但是当我与: 以上结果为假, 我很困惑,所以有人可以告诉我为什么吗? 问题答案: 该==运营商比较对象引用,在不值秒。 要比较 的值,请使用以下方法: Java中的任何其他对象都是如此-比较值时,请始终使用equals方法而不是使用==运算符。 该方法是的一部分,并且应被将以一种或另一种方式进行比较的类覆盖。

  • 问题内容: 我问这个问题是因为我知道以下检查列表是否为空的pythonic方法: 将打印等,所以这让我找出与真值; 但是,如果我尝试将[]和False直接“比较”,则会获得以下信息: 等等… 这里发生了什么?我觉得我确实缺少一些明显的东西。 问题答案: 该语句在布尔上下文中评估所有内容,就像对内置函数的隐式调用一样。 这是您实际检查语句如何评估事物的方式: 参见真值测试文档,空列表被 认为是错误的

  • 问题内容: 为什么用Python生成? 我在这里阅读以下内容: 如果两个字符串文字相等,则将它们放在相同的内存位置。字符串是不可变的实体。不会造成伤害。 那么每个Python字符串在内存中只有一个位置吗?听起来很奇怪。这里发生了什么? 问题答案: Python(例如Java,C,C ++ 、. NET)使用字符串池/内联。解释器意识到“ hello”与“ hello”相同,因此它优化并使用了内存中

  • 问题内容: 有谁知道,为什么Oracle的(和)函数总是对第二个参数求值,即使第一个参数不是呢? 简单测试: 返回,但也打印。 已调用,即使由于第一个参数不是,结果也被忽略了。 问题答案: 一直都是这种方式,因此Oracle必须保持这种方式以保持向后兼容。 使用,而不是让短路行为。