码迷,mamicode.com
首页 > 编程语言 > 详细

java自动拆箱装箱易导致的两个错误

时间:2014-07-08 13:26:20      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:style   blog   java   color   strong   文件   

自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.



java自动拆箱装箱易导致的两个错误,布布扣,bubuko.com

java自动拆箱装箱易导致的两个错误

标签:style   blog   java   color   strong   文件   

原文地址:http://blog.csdn.net/acm365/article/details/37530647

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!