当前位置: 首页 > 工具软件 > Autobox2 > 使用案例 >

java autobox 的一点陷阱

史昱
2023-12-01

  应该是从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();
 类似资料: