拆箱如何在短路布尔表达式中工作?

Rei*_*977 5 java primitive unboxing boolean-expression primitive-types

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

第一:

// ...
System.out.println( (Boolean)null || true );
// ...
Run Code Online (Sandbox Code Playgroud)

第二:

// ...
System.out.println( (Boolean)null || false );
// ...
Run Code Online (Sandbox Code Playgroud)

第一个示例导致以下输出:
true

第二个示例导致以下输出:    com.blah.main
中线程"main"java.lang.NullPointerException
中的异常(SanityCheck.java:26)

我原以为这两个例子都会导致空指针异常,因为任何短路都是从左到右应用的.从布尔值中取消装箱布尔值的尝试应该在逻辑的另一侧或考虑之前失败.

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

use*_*672 2

我会尝试一下。当编译器尝试解释这两个语句时,主要区别在于右侧为 true 的语句不需要使用左手布尔值进行计算,而右侧为 false 的语句则需要。

布尔值是一个对象,因此可以将其设置为 null。那不是抛出异常的地方。当您尝试对设置为 null 的 Boolean 对象执行操作时,将引发 NullPointerException。在 true 情况下,编译器会将 null 强制转换为布尔值,并且由于与 true 进行“或”运算将始终产生 true,因此条件为 true。在 false 的情况下,编译器将再次将 null 转换为 Boolean,然后检查 false,如果条件为 false,则需要与布尔值计算 OR,因为条件最终可能结果为 true 或 false。当计算发生时,会抛出 NullPointerException。