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

为什么会抛出 NullPointerException


public 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中是否有任何引用可以证实这种行为,尤其是第二种情况?


HUWWW
浏览 355回答 3
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

根据Java语言规范的第15.25节:如果第二个操作数和第三个操作数之一为布尔型,而另一个的类型为布尔型,则条件表达式的类型为布尔型。所以,第一个例子试图调用Boolean.booleanValue(),以转化Boolean到boolean按第一条规则。在第二种情况下,第一个操作数为空类型,而第二个操作符不是引用类型,因此将应用自动装箱转换:否则,第二和第三操作数分别为S1和S2类型。令T1为对S1进行装箱转换所产生的类型,而T2为对S2进行装箱转换所产生的类型。条件表达式的类型是将捕获转换(§5.1.10)应用于lub(T1,T2)(§15.12.2.7)的结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java