那些年一起踩过的坑 — java 自动装箱拆箱问题

  • 坑在哪里?

我们都知道Java的八种基本数据类型:int, short, long, double, byte, char, float, boolean

分别有各自对应的包装类型:Integer, Short, Long, Double, Byte, Character, Float, Boolean

并且二者之间可以相互直接赋值,例如:

1 // 基本数据类型赋值给封装类
2 inta = 1;
3 Integer b = a;
4 // 封装类型赋值给基本数据类型
5 Character c = new Character('c');
6 chard = c;

但是,当包装类赋值给基本数据类型的时候,如果包装类型为空,那么自动拆箱(auto-unboxing)就会有问题了:

1 Integer i = null;
2 intj = i;

这样的代码,虽然可以编译通过,但IDE会提示自动拆箱的时候包装类是不允许为空的,

Null pointer access: This expression of type Integer is null but requires auto-unboxing

这是为什么呢?

debug你就会发现,Integer自动拆箱调的是Integer.intValue()方法,所以,如果对象本身为空的话,调内部的方法就会抛空指针了。

  • 为什么会被坑呢?

既然IDE都给提示了,应该不会犯这种低级错误吧?!呵呵。。。

那如果是将A对象的Integer成员变量赋值给了B对象的int类型变量呢?往往有人就这么写了:

b.setIntVal(a.getIntegerVal());

这不正是把Integer赋值给了int类型吗,而如果此时的A对象中的这个Integer变量正好为空,bingo!恭喜你,空指针异常!!!

  • 怎么能不被坑呢?
    1. 如果是两个意义完全相同的字段,请保证类型和变量名完全一致
    2. 表示同一种类的字段 类型定义一致,例如: 价格字段 都定义成float 或Float
  • 还有没有其他坑?

有,基本数据类型和包装类之间的比较应该用 equals 还是 == ?

不在此详述,请参考http://blog.csdn.net/jairuschan/article/details/7513045