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.



你可能感兴趣的:(java自动拆箱装箱易导致的两个错误)