本帖最后由 我是菜鸟 于 2013-1-21 15:37 编辑
public static void main(String[] args)
{
Map<String, Integer> map = new HashMap<String, Integer>();
String str = "x";
Integer i = Math.random()*10 > 7? 5 : null;
System.out.println(i);
map.put(str, map.get(str)==null ? i : (map.get(str) + (i==null? 1 : i)));
}
这段代码会报NullPointerException,看看哪位能找出来并说出原因
=============================================================================
HashMap<String, Integer>
map.put(str, map.get(str)==null ? i : (map.get(str) + (i==null? 1 : i)));
在编译时期就要确定表达式的类型
i==null? 1 : i,表达式2和3分别是int和Integer,该语句的返回类型是int,可以推出表达式3也就是 (map.get(str) + (i==null? 1 : i))的返回类型为int
可以看作:
map.get(str)==null ? Integer : int,所以当i=5的时候,i可以正常拆箱,但当i=null,拆箱的时候调用null.intValue(),就会报空指针异常
验证:
map.put(str, map.get(str)==null ? 1 : (map.get(str) + (i==null? 1 : i)));
把i改成常量,保证表达式2类型为int,这时无论i等于什么,程序都正常,可以说明问题就出在表达式2的拆箱
所以在使用三元运算符,如果:两边表达式的类型不一致,最好做显式强制类型
map.put(str, map.get(str)==null ? i : (Integer)(map.get(str) + (i==null? 1 : i)));
*如果有问题或疑问,请指出,谢谢
|