• 那些年一起踩过的坑 — 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中获取URL的域名或IP与端口
    解决notepad++64位没有plugin manager的问题
    统一认证需要解决的问题
    搭建Maven私服
    Update openssh7.9 on centos6
    python下载想听的有声书,让喜马拉雅收费,我是程序员!
    golang ---获取内存信息
    websocket学习
    go 读取BMP文件头二进制读取
    go 计算文件行
  • 原文地址:https://www.cnblogs.com/beetle-shu/p/5274277.html
Copyright © 2020-2023  润新知