NullPointer三元表达式中具有自动装箱的异常

2022-09-01 18:26:30

运行以下 Java 代码:

boolean b = false;
Double d1 = 0d;
Double d2 = null;
Double d = b ? d1.doubleValue() : d2;

为什么有 NullPointerException?


答案 1

条件表达式的返回类型为 。条件表达式必须具有单个返回类型。按照二进制数字提升的规则,会自动取消框到 ,这会导致 when 。b ? d1.doubleValue : d2doubled2doubleNullPointerExceptiond2 == null

来自语言规范,§15.25 节:

否则,如果第二个和第三个操作数具有可转换为数值类型的类型 (§5.1.8),则有以下几种情况:...

否则,二进制数值提升 (§5.6.2) 将应用于操作数类型,条件表达式的类型是第二和第三个操作数的升级类型。请注意,二进制数字升级会执行拆箱转换 (§5.1.8) 和值集转换 (§5.1.13)。


答案 2

因为周围的两个表达式必须返回相同的类型。这意味着 Java 会尝试将表达式转换为 。这意味着字节码调用 -> NPE。:d2doubledoubleValue()d2


推荐