zoukankan      html  css  js  c++  java
  • 那些年一起踩过的坑 — 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 还是 == ?
     
     
  • 相关阅读:
    谷歌火狐浏览器限制的端口
    Web Api 内部数据思考 和 利用http缓存优化 Api
    Web Api 端点设计 与 Oauth
    FI-FBV0
    Others-SAP hybris 介绍
    ABAP-表修改日志存储
    TR-银行通信相关文档
    ABAP-Eclipse ADT中创建ABAP CDS视图
    TR-业务流程图
    FPM-OVP增强实例-银行账户
  • 原文地址:https://www.cnblogs.com/beetle-shu/p/5274277.html
Copyright © 2011-2022 走看看