• 坑在哪里?
 
我们都知道Java的八种基本数据类型:int, short, long, double, byte, char, float, boolean
 
分别有各自对应的包装类型:Integer, Short, Long, Double, Byte, Character, Float, Boolean
 
并且二者之间可以相互直接赋值,例如:
 // 基本数据类型赋值给封装类
inta = 1;
Integer b = a;
// 封装类型赋值给基本数据类型
Character c = new Character('c');
chard = c;
但是,当包装类赋值给基本数据类型的时候,如果包装类型为空,那么自动拆箱(auto-unboxing)就会有问题了:
 Integer i = null;
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 还是 == ?
 
 

最新文章

  1. 简易的轮廓边生成(N和V dot点乘方式)(surface方式和vs ps 方式的分别实现)
  2. ToolBar 修改边距
  3. 各大OJ
  4. 【usaco】patrol
  5. jsp片段
  6. IE 8 中 parseInt 的注意点
  7. AOP和IOC个人理解
  8. ACCP6.0 教程课件,可用
  9. ueditor的工具按钮配置
  10. redhat 6.8 配置centos6的yum源
  11. TP3.2.3 接入银联支付
  12. mac电脑上不能用移动硬盘的原因和方法
  13. mysql 唯一索引与null.md
  14. MySQL 基本语句(1)
  15. C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别
  16. Python3绘图库Matplotlib(02)
  17. CHARACTER SET
  18. SQL Server物化视图学习笔记
  19. Repeter中列相同数据合并
  20. k8s实战之Service

热门文章

  1. CentOS服务器 6.6 安装MySQL5.5.46
  2. 1037: [ZJOI2008]生日聚会Party - BZOJ
  3. EasyUI datagrid 改变url属性 实现动态加载数据
  4. Educational Codeforces Round 5 B
  5. CSRF攻击原理解析与对策研究
  6. Untiy 接入 移动MM 详解
  7. JNI和NDK的区别
  8. SPRING IN ACTION 第4版笔记-第九章Securing web applications-008-使用非关系型数据库时如何验证用户(自定义UserService)
  9. Windbg调试命令详解(3)
  10. JavaScript DOM高级程序设计 5动态修改样式和层叠样式表2--我要坚持到底!