java - 拆箱如何在短路 boolean 表达式中工作?

标签 java primitive primitive-types boolean-expression unboxing

我最近尝试运行以下两段代码,并对输出结果感到惊讶。

首先:

// ...
System.out.println( (Boolean)null || true );
// ...

第二个:

// ...
System.out.println( (Boolean)null || false );
// ...

第一个示例产生以下输出:
是的

第二个示例产生以下输出:
线程“main”中的异常 java.lang.NullPointerException
在 com.blah.main(SanityCheck.java:26)

我原以为这两个示例都应该导致空指针异常,因为任何短路都是从左到右应用的。从 boolean 值中拆箱的尝试应该在逻辑的另一侧之前失败或被考虑。

谁能解释这种不一致的行为?

最佳答案

我通过 JAD 运行类文件以查看优化后的代码是什么样的。对于真实情况:

// ...
System.out.println(true);
// ...

对于错误的情况:

// ...
System.out.println(null.booleanValue());
// ...

关于java - 拆箱如何在短路 boolean 表达式中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18393735/

相关文章:

java - 声明不必要的较大数据类型、变量类型及其性能

java - 其他获取 `int[].class` 的方法?

java - tomcat 如何为语言环境请求提供 Http,为远程请求提供 https

java - 错误: incompatible types: possible lossy conversion from double to int

java - 无法设置App Engine测试环境

opengl - Modern OpenGL 3.x 及更高版本如何绘制图元?

java - int.class 是否等于 Java 中的 Integer.class 或 Integer.TYPE?

java - 在 Eclipse 中向 Project Explorer 添加过滤器

java - 在 Java HashMap 中保留一对原语

ios - KVO 核心数据和原始访问器