记录一个使用三目表达式时遇到的问题:问题是由三目表达式与自动拆箱同时使用造成的(显然自动拆箱并不是我自己主动调用的)
首先来看出问题的代码:
Map<String, Integer> map = new HashMap<String, Integer>();
Integer i = (map != null ? map.get("test") : 0);
该段代码运行结果为空指针,既然报空指针说明是有null对象调用了某个方法,这段代码中也就map.get("test")这一处调用,map已经事先初始化过了所以不会是null。于是我将该class文件进行了反编译:
Map map = new HashMap();
Integer i = Integer.valueOf((map != null) ? ((Integer) map.get("test")).intValue() : 0);
可以看到, ((Integer) map.get("test")).intValue()这里的 map.get("test")的返回值是null,之后强转为Integer还是null,所以null调用intValue()导致了空指针异常。
这里就要注意三目运算符的语法规范了,简单的来说就是:当第二,第三位操作数分别为对象和基本类型时,其中的对象就会拆箱为基本类型。
所以,结果就是:由于使用了三目运算符,并且第二、第三位操作数分别是对象和基本类型。所以对对象进行拆箱操作,由于该对象为null,所以在拆箱过程中调用null.intValue()的时候就报了空指针。 所以正确的写法应该是:
Map<String, Integer> map = new HashMap<String, Integer>();
Integer i = (map != null ? map.get("test") : Integer.valueOf(0));
反编译的结果为:
Map map = new HashMap();
Integer i = (map != null) ? (Integer) map.get("test") : Integer.valueOf(0);
可以看到,当第二,第三位操作数都是对象时就不会进行拆箱操作,也就不会出现上述问题。