我最近尝试运行以下两段代码,并对输出结果感到惊讶。
首先:
// ...
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/