JavaSE教程_基础
当一个空的引用去访问实例变量会出现什么问题吗?请看以下代码:
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。
总之,当一个“空的引用”去访问“对象相关/实例相关”数据的时候,此时一定会发生空指针异常。