當一個空的引用去訪問實例變量會出現什么問題嗎?請看以下代碼:
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。
總之,當一個“空的引用”去訪問“對象相關/實例相關”數據的時候,此時一定會發生空指針異常。