应该是从jdk1.5 开始的吧,java 支持 基本类型的自动 封箱解箱 ,如 int 会 自动转化成 integer ,char 自动转为 character ,于是一不小心我就遇到了问题:
1.
//return a value
Integer getV() {
//
}
经常会测试条件 : getV() == 1 || getV== 2 或 3==getV()
经常会莫名报 nullpoint exception ,由于getV() 是别人写的接口 , 且 不可能出问题 ,分析良久才发现 getV()可能会返回 null ,那么在与 1 作比较时 ,getV()返回的 Integer 会自动 解箱 为 int 型 ,但是 当返回为 null 时 没有对应的基本类型,就会出现 nullpoint 了。。。。
基本上还是我的编程习惯不好,在对一个对象进行操作时 ,必须首先测试它是否为null ,或者 api开发人员采用了NULL 设计模式 时 另论 。
全部改为 getV()!=null &&(getV() == 1 || 2 == getV()) 更为健壮了 ,仅供演示 ,getV()多次调用了。
2. java 的自动解箱 也用在了 函数原型匹配上 ,比如 定义函数
void x(char y) {
//TODO
}
Character yy=getCharacter();
x(yy); //ps :idea 提示找不到函数 。。。
则 上述代码可以编译通过,并大多情况下可以运行 ,但是当 yy ==null 时 ,由于java 自动解箱 yy 为 char ,则 报出
nullpointexception ,这点一定要注意了
ps: 来自某书的话:
有趣程序:
Integer i1 = 100;
Integer i2 = 100;//显示"i1 == i2"
if (i1 == i2) System.out.println("i1 == i2");
else
System.out.println("i1 != i2");
i1 = 200; i2 = 200;
if (i1 == i2) System.out.println("i1 == i2");
else
System.out.println("i1 != i2");
//显示"i1 != i2"
在自动装箱时对于值从-128到127之间的 值,它们被装箱为Integer对象后,会存在 内存之中被重用
自动装箱与拆箱的功能是编译程序来帮忙
Integer i = 100; //=>
Integer i = new Integer(100);
自动装箱与拆箱的功能是所谓的「编译程序蜜糖」(Compilersugar)
Integer i = null; int j = i; // =>
Integer i = null; int j = i.intValue();