首页 > 代码库 > java自动拆箱装箱易导致的两个错误
java自动拆箱装箱易导致的两个错误
自J2SE 5.0开始提供的基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)功能。
何为自动装箱:
当我们创建一个Integer对象时,却可以这样:
Integer i = 100; (注意:不是 int i = 100; )
实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = new Integer(100); 此即基本数据类型的自动装箱功能。
何为自动拆箱
自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出。如下可实现自动拆箱:
Integer integer=100;
int flag=integer; //该语句即实现了自动拆箱。
在进行编译时,编译器再自动根据您写下的语句,判断是否进行自动装箱动作。
错误一:NullPointerException
如下程序在编译时不会出错,在运行时则会报NullPointerException
Integer i = null; int j = i;
Integer i = null; int j = i.intValue();
null表示i没有参考至任何的对象实体,它可以合法地指定给对象参考名称。由于实际上i并没有参考至任何的对象,所以也就不可能操作intValue()方法,这样上面的写法在运行时会出现NullPointerException错误。
错误二:NoSuchMethodError
java在进行编译时期,会自动进行装箱拆箱操作,当我们编译结束,生成的.class文件后,该.class二进制文件肯定将Integer对象和基本数据类型区别对待。
错误重现:
步骤一:编译Student类
public class Student { public int getStudents(int flag){ return flag; } }步骤二:编译并运行Teacher类,无任何问题
public class Teacher { private static Student student=new Student(); public static void main(String[] args) { System.out.println(getTeacherCount(3)); } public static int getTeacherCount(Integer integer) { return student.getStudents(3); } }
步骤三:
我们修改Student类,并编译
<pre name="code" class="java" style="color: rgb(51, 51, 51); line-height: 20px; ">public class Student { public Integer getStudents(Integer integer){ return integer; } }
步骤四,
重新运行Teacher类中的main方法,报错NoSuchMethodError.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。