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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了那些年一起踩过的坑 — 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 还是 == ?
 
 

以上是关于那些年一起踩过的坑 — java 自动装箱拆箱问题的主要内容,如果未能解决你的问题,请参考以下文章

那些年我们一起踩过的坑

那些年一起踩过的坑 — Date类型序列化的问题

我的 5 年 Android 学习之路,那些年一起踩过的坑

那些年,我们一起踩过的3个spring事务的大坑

Fragment全解析系列:那些年踩过的坑

记录那些年我踩过的坑