为什么会抛出 NullPointerExceptionpublic static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b);}public static Boolean returnsNull() { return null;}虽然这不是public static void main(String[] args) throws Exception { Boolean b = true ? null : false; System.out.println(b); // null}?解决方案是通过替换false方式Boolean.FALSE来避免null被取消装箱-这boolean是不可能的。但这不是问题。问题是为什么?JLS中是否有任何引用可以证实这种行为,尤其是第二种情况?
3 回答
白板的微信
TA贡献1883条经验 获得超3个赞
该行:
Boolean b = true ? returnsNull() : false;
在内部转换为:
Boolean b = true ? returnsNull().booleanValue() : false;
执行拆箱;因此:null.booleanValue()将产生NPE
这是使用自动装箱时的主要陷阱之一。此行为确实记录在5.1.8 JLS中
编辑:我相信取消装箱是由于第三个运算符是布尔类型,例如(添加了隐式强制转换):
Boolean b = (Boolean) true ? true : false;
德玛西亚99
TA贡献1770条经验 获得超3个赞
根据Java语言规范的第15.25节:
如果第二个操作数和第三个操作数之一为布尔型,而另一个的类型为布尔型,则条件表达式的类型为布尔型。
所以,第一个例子试图调用Boolean.booleanValue(),以转化Boolean到boolean按第一条规则。
在第二种情况下,第一个操作数为空类型,而第二个操作符不是引用类型,因此将应用自动装箱转换:
否则,第二和第三操作数分别为S1和S2类型。令T1为对S1进行装箱转换所产生的类型,而T2为对S2进行装箱转换所产生的类型。条件表达式的类型是将捕获转换(§5.1.10)应用于lub(T1,T2)(§15.12.2.7)的结果。
添加回答
举报
0/150
提交
取消