布尔条件

Boolean if condtion

以下代码片段抛出 NullPointerException。我试图了解 if 条件的工作流程。如果只有 truefalseif 条件的有效参数,为什么 Java 编译器不会抛出错误?

 Boolean booleanFlag = null;

 if(booleanFlag) {
     System.out.println("Why this boolean flag code is executed?");
 }

The java.lang.Boolean class wraps a value of the primitive type boolean in an object. An object of type Boolean contains a single field whose type is boolean.

Java 编译器确实会根据任何数据流分析提供错误(除了检查变量是否已初始化,在本例中您已将其初始化为 null)。完全没有意识到 booleanFlag 的值在执行的那一刻必然是 null

至于为什么,我只能推测语言作者知道这样的特性会给语言增加太多的复杂性和编译器的性能成本。

这与 Java 称为自动(取消)装箱的功能有关。基本上,在幕后,编译器将这段代码翻译成类似的东西:

if (booleanFlag.booleanValue()) {
  //..

}

现在,如果 booleanFlag 是 null,那么它会在运行时抛出 NPE 。这就是 Joshua Bloch 所说的 "autoboxing blurs but does not erase the divide between primitive types and boxed equivalents".

的意思

也许在这种特殊情况下,初始化装箱原始编译器至少可以生成警告,但一般来说,生成这样的警告是不可能的。

Java 语言定义包括自动 "boxing" 和 "unboxing"

的概念

这允许原始类型(booleanintdouble 等)自动转换为它们的 Object 等价物(装箱),对于像 BooleanInteger 等要转换为原语(拆箱)

但是拆箱要求对象(例如Boolean)不为空。如果它为 null,则这是一个运行时错误 (NullPointerException)。这一定是运行时错误,因为该语言没有提供足够的信息来在编译时一致地检测空条件。

在你的情况下,编译器试图将你的 Boolean booleanFlag 拆箱到 boolean 中,以便它可以用于 if 条件,并且转换失败。