เพื่อทำความเข้าใจ ความหมายของ nullใน Java ให้ดูที่การเปรียบเทียบกับตัวเลข: เลข 0 เป็นสัญลักษณ์ของการไม่มีบางสิ่งบางอย่าง และnullหมายถึงสิ่งเดียวกันเมื่อพูดถึงประเภทข้อมูลอ้างอิง หากฟิลด์ของประเภทการอ้างอิง (เช่นString , ObjectหรือStringBuilder ) ไม่ได้รับการกำหนดค่าอย่างชัดแจ้ง ดังนั้น โดยการเปรียบเทียบกับประเภทดั้งเดิม ฟิลด์นั้นจะได้รับค่าเริ่มต้น และค่านั้นเป็นnull :

รหัส เอาต์พุตคอนโซล
public class Solution {

    public static int i;
    public static String s;

    public static void main(String[] args) {
        System.out.println(i);
        System.out.println(s);
    }
}
0
เป็นโมฆะ

แต่ถ้าคุณประกาศอาร์เรย์เช่นนี้:

String[] strings = new String[12];

อาร์เรย์จะถูกสร้างขึ้นโดยมีองค์ประกอบ 12 รายการ และองค์ประกอบทั้งหมดจะเป็นค่าว่าง :

รหัส เอาต์พุตคอนโซล
public class Solution {
    public static void main(String[] args) {
        String[] strings = new String[12];

        for (int i = 0; i < strings.length; i++) {
            System.out.println("Element " + i + ":" + strings[i]);
        }
    }
}
องค์ประกอบ 0: null
องค์ประกอบ 1: null
องค์ประกอบ 2: null
องค์ประกอบ 3: null
องค์ประกอบ 4: null
องค์ประกอบ 5: null
องค์ประกอบ 6: null
องค์ประกอบ 7: null
องค์ประกอบ 8: null
องค์ประกอบ 9: null
องค์ประกอบ 10: null
องค์ประกอบ 11: null

อย่างที่คุณเห็น เมื่อเชื่อมกับสตริง ค่าnullจะกลายเป็นสตริง " null " ที่กล่าวว่าถ้าคุณเรียก ใช้เมธอด toString()เช่นนี้:

String[] strings = null;
System.out.println(strings.toString());

จากนั้นคุณจะได้รับNullPointerException (เราจะพูดถึงข้อยกเว้นโดยละเอียดในภายหลัง) สิ่งเดียวกันนี้จะเกิดขึ้นหากคุณพยายามเรียกใช้เมธอดอื่นบนnull (ข้อยกเว้นคือเมธอดสแตติก ซึ่งคุณจะได้ทราบในไม่ช้า):

public static void main(String[] args) {
    StringBuilder sb = null;
    sb.append("test"); // This will compile, but there will be a runtime error
}

nullเป็นคีย์เวิร์ดที่สงวนไว้ (เช่นpublicหรือstatic ) ดังนั้นคุณจึงไม่สามารถสร้างตัวแปร เมธอด หรือคลาสชื่อnullได้ เช่นเดียวกับคำอื่นๆ คำหลักนี้คำนึงถึงตัวพิมพ์เล็กและใหญ่ (คุณอาจสังเกตเห็นว่าเราเขียนnullเป็นตัวพิมพ์เล็กในทุกที่) นั่นหมายความว่า:

String firstName = Null; // Compilation error
String secondName = NULL; // Compilation error
String fullName = null; // This will compile

ลองดูสิ่งอื่นที่คุณทำได้และทำไม่ได้ด้วยnull :

  • คุณสามารถกำหนดค่าว่างให้กับการอ้างอิงใดก็ได้:

    StringBuilder sb = null;
  • nullสามารถส่งไปยังประเภทการอ้างอิงใดก็ได้:

    String s = (String) null; // This will compile, but doing this doesn't make any sense :)
  • ไม่สามารถกำหนด nullให้กับตัวแปรดั้งเดิม:

    int i = null; // This won't compile
  • ค่า nullสามารถเปรียบเทียบได้โดยใช้==และ!=

  • null == nullส่งคืนค่าจริง

ในบทที่แล้ว เราได้พูดถึงว่าทุกอย่างใน Java เป็นออบเจกต์อย่างไร และทุกออบเจกต์มีประเภท

เราสามารถพูดอะไรเกี่ยวกับโมฆะในแง่นี้ได้บ้าง? nullเป็นตัวอักษรของบางประเภท และประเภทนี้ไม่มีชื่อ และเนื่องจากประเภทนี้ไม่มีชื่อ จึงเป็นไปไม่ได้ที่จะประกาศตัวแปรประเภทนี้หรือส่งไปยังตัวแปรประเภทนี้ ดังนั้นnullจึงเป็นเพียงตัวแทนของประเภทที่ไม่มีชื่อนี้ ในทางปฏิบัติ เราสามารถเพิกเฉยต่อประเภทนี้ และคิดว่าnullเป็นตัวอักษรพิเศษที่สามารถกำหนดให้กับตัวแปรอ้างอิงใดๆ

สิ่งที่ต้องจำ:

  • nullเป็นค่าดีฟอลต์สำหรับชนิดข้อมูลอ้างอิง
  • nullหมายถึง "ไม่มีค่า"
  • หากเราเรียกเมธอดใดๆ บนออบเจกต์ที่มีค่าเป็นnull โค้ดจะคอมไพล์ แต่ที่รันไทม์ เราจะได้NullPointerException