关于三目表达式问题

2017-08-22  本文已影响0人  sushengren

记录一个使用三目表达式时遇到的问题:问题是由三目表达式与自动拆箱同时使用造成的(显然自动拆箱并不是我自己主动调用的)

首先来看出问题的代码:

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);

可以看到,当第二,第三位操作数都是对象时就不会进行拆箱操作,也就不会出现上述问题。

上一篇下一篇

猜你喜欢

热点阅读