首页 > 解决方案 > 三元表达式可以产生空布尔值而没有编译器错误?

问题描述

给定以下代码:

boolean c = true;
boolean d = true;
boolean b = c ? null : d;

System.out.println(b);

为什么编译器不在这里抱怨?变量 b 是原始数据类型,null 不应该产生类似“类型不匹配:无法从 null 转换为布尔值”之类的错误消息吗?

我最好的猜测是,有一些自动装箱正在进行吗?我在一个项目中看到了这段代码,但我很想知道这背后的确切原因......

EDIT1:如下面的 Mena 所述,此代码在运行时生成 NullPointer

编辑 2:以下表格也可以正确编译:

boolean c = false;
boolean d = true;
boolean b = c ? null : d;

System.out.println(b);

编辑 3:尝试使用编译器级别 1.4 进行编译时,这不会编译,但会产生错误:

Incompatible conditional operand types null and boolean.

那么自动装箱是否有意义,因为它是在 1.5 中引入的?

标签: javajava-8

解决方案


RHS 上的表达式是类型的Boolean,将在运行时自动拆箱;编译时类型检查不会受到影响。拆箱将导致运行时异常。


推荐阅读