第一章 面向对象
第二章 异常
第三章 数组
第四章 常用类
第五章 集合
第六章 IO流
第七章 线程
第八章 反射
第九章 Socket编程

java空指针异常

 

当一个空的引用去访问实例变量会出现什么问题吗?请看以下代码:

 

public class Balloon {
	//颜色
	String color;
	//气体
	String gas;
	//构造方法
	public Balloon(){
		
	}
	public Balloon(String _color , String _gas){
		color = _color;
		gas = _gas;
	}
}

 

public class BalloonTest {
	public static void main(String[] args) {
		Balloon ball = new Balloon("红色" , "氢气");
		System.out.println("气球颜色是:" + ball.color);
		System.out.println("气球中的气体是:" + ball.gas);
		ball = null;

//空指针异常
		System.out.println("气球颜色是:" + ball.color); 
	}
}

运行结果如下图所示:

 

图9-22:空指针异常演示

 

java.lang.NullPointerException被称为空指针异常,在java编程当中属于很常见的异常,接下来研究一下以上程序执行过程的内存图是如何变化的。请看下图:

 

图9-23:Balloon ball = new Balloon("红色" , "氢气");

 

图9-24:ball = null;

 

以上程序语法正确,编译通过,因为程序在编译阶段检测出“引用ball”属于Balloon类型,在Balloon类中有color属性,所以编译器允许通过ball引用去访问color属性,例如以上代码的ball.color。但是程序在运行阶段会通过ball引用查找堆内存当中的对象,因为color是实例变量,该变量存储在java对象内部,当ball = null执行之后表示“引用ball”不再保存java对象的内存地址,换句话说通过ball引用已经无法找到堆内存当中的java对象了,对于程序来说这个时候就没有办法正常访问了,这种情况下就会发生空指针异常。就好比一个小孩儿放风筝,通过拽线来操控风筝,结果线断了,再拽风筝线的时候,已经无法再操控风筝了,这对于小孩儿来说是一种异常。而java程序中把这种异常叫做NullPointerException。

总之,当一个“空的引用”去访问“对象相关/实例相关”数据的时候,此时一定会发生空指针异常。

全部教程