เพื่อทำความเข้าใจ ความหมายของ nullใน Java ให้ดูที่การเปรียบเทียบกับตัวเลข: เลข 0 เป็นสัญลักษณ์ของการไม่มีบางสิ่งบางอย่าง และnullหมายถึงสิ่งเดียวกันเมื่อพูดถึงประเภทข้อมูลอ้างอิง หากฟิลด์ของประเภทการอ้างอิง (เช่นString , ObjectหรือStringBuilder ) ไม่ได้รับการกำหนดค่าอย่างชัดแจ้ง ดังนั้น โดยการเปรียบเทียบกับประเภทดั้งเดิม ฟิลด์นั้นจะได้รับค่าเริ่มต้น และค่านั้นเป็นnull :
รหัส | เอาต์พุตคอนโซล |
---|---|
|
0
เป็นโมฆะ |
แต่ถ้าคุณประกาศอาร์เรย์เช่นนี้:
String[] strings = new String[12];
อาร์เรย์จะถูกสร้างขึ้นโดยมีองค์ประกอบ 12 รายการ และองค์ประกอบทั้งหมดจะเป็นค่าว่าง :
รหัส | เอาต์พุตคอนโซล |
---|---|
|
องค์ประกอบ 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
GO TO FULL VERSION