NullPointerException,在三元表达式中具有自动装箱功能

Ale*_*der 23 java autoboxing nullpointerexception

运行以下Java代码:

boolean b = false;
Double d1 = 0d;
Double d2 = null;
Double d = b ? d1.doubleValue() : d2;
Run Code Online (Sandbox Code Playgroud)

为什么会出现NullPointerException?

Jus*_*ini 35

条件表达式的返回类型b ? d1.doubleValue : d2double.条件表达式必须具有单个返回类型.遵循二进制数字促销的规则,自动d2装箱到a double,这会导致NullPointerException时间d2 == null.

从语言规范,第15.25节:

否则,如果第二个和第三个操作数具有可转换的类型(第5.1.8节)到数字类型,那么有几种情况:...

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


Aar*_*lla 15

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

  • 这不是左派的类型.如果你这样做了吗?d2:d1.doubleValue()`左边的类型是`Double`,但它仍然是一个`NullPointerException`,因为取消装箱转换会使表达式的类型为"double". (2认同)

归档时间:

查看次数:

6343 次

最近记录:

6 年,5 月 前