Java操作符拆箱之坑

来源:互联网 发布:php技术总监 招聘 编辑:程序博客网 时间:2024/06/05 15:35

Java有各种的操作符,Java也支持装箱拆箱操作,但当这两个看似不相关的东西遇到一起的时候,那将会是……一!个!大!坑!

我们先来看一段代码

public static void main(String[] args) {        Map<String, Object> map = Maps.newHashMap();        AClass a = new AClass();        Integer test = map.get("a") == null ? a.getA() : 2;        System.out.println(test);}
这将会输出什么?第一反应是null吗?这是很正常的想法,前提是你不知道这里面包含了一个拆箱操作。

a.getA()这里编译器会进行一个拆箱操作,因此这里等价于a.getA().intValue();这里显而易见会抛出个空指针出来。

而且,这个问题不仅限于三目运算符,大于、等于等运算符都会有这个问题。

解决的方法可以将值进行装箱操作使运算符中的操作数类型一致:Integer.valueOf(2);

但是,需要注意,如果这里使用Long.valueOf(2);还是会抛出空指针,因为这样会使a.getA()类型提升类Long,还是会触发拆箱装箱操作,因此一方面想办法保证操作数的类型一致,另一方面,写代码的时候一定要各种小心。

参考文献:http://blog.csdn.net/nazir2513/article/details/50175891

原创粉丝点击