Java空物件(null)是怎麼回事?

2020-07-16 10:05:20
Java 語言支援兩種資料型別,分別是基本資料型別和參照資料型別,而 null 是一種特殊的參照資料型別。本節主要介紹 Java 空物件是什麼及如何判斷物件是否為空。

經過《Java new運算子深入剖析》一節的學習,我們知道了物件的範例化就是為物件開闢記憶體空間。

例如以下 3 條語句(如果理解下面內容有點困難,建議先學習《Java new運算子深入剖析》一節):

Student stu = new Student();    // 語句1
Student stu2;                            // 語句2
stu2 = new Student();                // 語句3

  • 語句 1 先宣告一個 Student 型別的變數 stu,然後利用 new 關鍵字為其建立範例。一步到位,定義了一個範例變數並同時賦值。
  • 語句 2 是宣告一個 Student 型別的變數 stu2,雖然從表述習慣上講 stu2 是範例變數,但實際上此時 stu2 並未成為一個真正的範例,它僅僅只是一個變數名字。
  • 語句 3 中的 stu2 才成為了一個 Student 範例,它指向了記憶體中的某塊地址空間。

為了明確表示那些僅有名字而沒有記憶體空間的變數的具體內容,Java 引入了關鍵字 null。 null 表示“空”的意思,是絕對意義上的空,這個空指的是不存在。

一個參照變數(當變數指向一個物件時,這個變數就被稱為參照變數)沒有通過 new 分配記憶體空間,這個物件就是空物件,Java 使用關鍵字 null 表示空物件。範例程式碼如下:

String str1= null;
str1 = "C語言中文網";

注意:null 是關鍵字,是大小寫敏感的,不能將 null 寫成 Null 或 NULL。

參照變數的預設值是 null。當試圖呼叫一個空物件的屬性或方法時,會丟擲空指標異常(NullPointerException),如下程式碼所示:
String str1;    // 相當於 String str1= null;
// 輸出null字串
System.out.println(str1);
// 呼叫length()方法
int len = str1.length();
第 5 行程式碼不會發生編譯錯誤,但是當程式碼執行到第 5 行時,系統會丟擲空指標異常。這是因為呼叫 length() 方法時,str1 是空物件。程式設計師應該避免呼叫空物件的屬性和方法。

判斷一個物件是否為 null,可以用if (obj == null) { }來判斷。程式碼如下:
// 判斷物件是否為null
if (str1 != null) {
    int len = str1.length();
}
如果把上面程式碼改成如下程式碼:
String str2 = "";
int num = str2.length();
System.out.println(num);    // 輸出結果為0
執行以上程式碼時沒有丟擲異常,因為 str2 是一個值為""的字串物件。""表示的是一個長度為 0 的空字串,它在記憶體中會被分配一個空間,str2 是直接指向""記憶體空間的範例化物件。

產生空物件主要有以下兩種可能性:
  1. 程式設計師自己忘記了範例化,所以程式設計師必須防止這種情況發生,應該仔細檢查自己的程式碼,為自己建立的所有物件進行範例化並初始化。
  2. 空物件是其它地方傳遞過來的,需要通過判斷物件是否為 null 進行避免。