为了账号安全,请及时绑定邮箱和手机立即绑定

布尔值,条件运算符和自动装箱

布尔值,条件运算符和自动装箱

HUWWW 2019-10-08 15:17:53
为什么会抛出 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; 


查看完整回答
反对 回复 2019-10-08
?
德玛西亚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)的结果。


查看完整回答
反对 回复 2019-10-08
  • 3 回答
  • 0 关注
  • 354 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信