NullPointer三元表达式中具有自动装箱的异常
2022-09-01 18:26:30
运行以下 Java 代码:
boolean b = false;
Double d1 = 0d;
Double d2 = null;
Double d = b ? d1.doubleValue() : d2;
为什么有 NullPointerException?
运行以下 Java 代码:
boolean b = false;
Double d1 = 0d;
Double d2 = null;
Double d = b ? d1.doubleValue() : d2;
为什么有 NullPointerException?
条件表达式的返回类型为 。条件表达式必须具有单个返回类型。按照二进制数字提升的规则,会自动取消框到 ,这会导致 when 。b ? d1.doubleValue : d2
double
d2
double
NullPointerException
d2 == null
来自语言规范,§15.25 节:
否则,如果第二个和第三个操作数具有可转换为数值类型的类型 (§5.1.8),则有以下几种情况:...
否则,二进制数值提升 (§5.6.2) 将应用于操作数类型,条件表达式的类型是第二和第三个操作数的升级类型。请注意,二进制数字升级会执行拆箱转换 (§5.1.8) 和值集转换 (§5.1.13)。
因为周围的两个表达式必须返回相同的类型。这意味着 Java 会尝试将表达式转换为 。这意味着字节码调用 -> NPE。:
d2
double
doubleValue()
d2