คือnull
อะไร
เป็นnull
ตัวอย่างของอะไร?
ชุดอะไรnull
เป็นของ?
มันเป็นตัวแทนในหน่วยความจำได้อย่างไร?
คือnull
อะไร
เป็นnull
ตัวอย่างของอะไร?
ชุดอะไรnull
เป็นของ?
มันเป็นตัวแทนในหน่วยความจำได้อย่างไร?
คำตอบ:
โมฆะเป็นตัวอย่างของอะไร?
ไม่มีมีเป็นชนิดที่ไม่มีเป็นnull
instanceof
instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
ในเวลาทำงานผลมาจากการที่
instanceof
ผู้ประกอบการคือtrue
ถ้าค่าของRelationalExpressionไม่ได้null
และการอ้างอิงอาจถูกโยนไปReferenceTypeClassCastException
โดยไม่ต้องยกfalse
มิฉะนั้นผลที่ได้คือ
ซึ่งหมายความว่าสำหรับประเภทใดE
และR
สำหรับการใด ๆE o
ที่o == null
, อยู่เสมอo instanceof R
false
ชุด 'null' เป็นของอะไร
นอกจากนี้ยังมีประเภทnullพิเศษประเภทของการแสดงออก
null
ซึ่งไม่มีชื่อ เนื่องจากประเภทnullไม่มีชื่อจึงไม่สามารถประกาศตัวแปรประเภทnullหรือแปลงเป็นประเภทnullได้ การnull
อ้างอิงเป็นเพียงค่าที่เป็นไปได้ของการแสดงออกของประเภทnull การnull
อ้างอิงสามารถส่งไปยังประเภทการอ้างอิงใด ๆ ได้เสมอ ในทางปฏิบัติโปรแกรมเมอร์สามารถละเว้นประเภทnullและเพียงแกล้งทำเป็นว่าnull
เป็นตัวอักษรพิเศษที่สามารถเป็นประเภทอ้างอิงใด ๆ
ว่างเปล่าคืออะไร?
ตามที่อ้าง JLS ข้างต้นกล่าวว่าในทางปฏิบัติคุณสามารถแกล้งทำเป็นว่า "เป็นเพียงตัวอักษรพิเศษที่สามารถเป็นประเภทอ้างอิงใด ๆ "
ในชวา null == null
(กรณีนี้ไม่ใช่ภาษาอื่นเสมอไป) โปรดทราบว่าตามสัญญาจะมีคุณสมบัติพิเศษนี้ (จากjava.lang.Object
):
public boolean equals(Object obj)
สำหรับผู้ที่ไม่ใช่
null
ค่าอ้างอิงx
, ควรx.equals(null)
return false
เป็นค่าเริ่มต้น (สำหรับตัวแปรที่มี) สำหรับประเภทการอ้างอิงทั้งหมด:
- ตัวแปรคลาสแต่ละตัวตัวแปรอินสแตนซ์หรือองค์ประกอบอาร์เรย์จะเริ่มต้นได้ด้วย ค่าเริ่มต้นเมื่อสร้าง:
null
เหมาะสำหรับทุกสภาพการอ้างอิงค่าเริ่มต้นคือ
วิธีการใช้สิ่งนี้แตกต่างกันไป คุณสามารถใช้มันเพื่อเปิดใช้งานสิ่งที่เรียกว่าเริ่มต้นขี้เกียจของฟิลด์null
จนกว่าจะใช้จริงซึ่งจะถูกแทนที่ด้วยค่า "จริง" (ซึ่งอาจมีราคาแพงในการคำนวณ)
นอกจากนี้ยังมีการใช้งานอื่น ๆ ลองตัวอย่างจากjava.lang.System
:
public static Console console()
คืนค่า : คอนโซลระบบถ้ามีเป็นอย่างอื่น
null
คอนโซลระบบถ้ามิฉะนั้น
นี่เป็นรูปแบบการใช้งานทั่วไป: null
ใช้เพื่อแสดงถึงการไม่มีอยู่ของวัตถุ
นี่คืออีกตัวอย่างการใช้งานคราวนี้จากjava.io.BufferedReader
:
public String readLine() throws IOException
คืนค่า :
String
เนื้อหาที่มีของบรรทัดไม่รวมถึงอักขระการยกเลิกบรรทัดหรือnull
ถ้าถึงจุดสิ้นสุดของสตรีม
ดังนั้นที่นี่readLine()
จะกลับinstanceof String
สำหรับแต่ละบรรทัดจนกระทั่งในที่สุดก็ส่งกลับnull
เพื่อหมายถึงจุดสิ้นสุด สิ่งนี้ช่วยให้คุณสามารถประมวลผลแต่ละบรรทัดดังต่อไปนี้:
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
หนึ่งสามารถออกแบบ API เพื่อให้เงื่อนไขการเลิกจ้างไม่ได้ขึ้นอยู่กับการreadLine()
ส่งคืนnull
แต่จะเห็นได้ว่าการออกแบบนี้มีประโยชน์ในการทำให้สิ่งต่าง ๆ รัดกุม "" != null
โปรดทราบว่ามีปัญหาเกี่ยวกับเส้นที่ว่างเปล่าไม่เพราะบรรทัดว่าง
ลองมาดูตัวอย่างอื่นคราวนี้จากjava.util.Map<K,V>
:
V get(Object key)
ส่งคืนค่าที่คีย์ที่ระบุถูกแมปหรือ
null
หากแผนที่นี้ไม่มีการแมปสำหรับคีย์หากแผนที่นี้อนุญาตให้ใช้
null
ค่าดังนั้นค่าส่งคืนของnull
ไม่จำเป็นต้องระบุว่าแผนที่ไม่มีการแมปสำหรับคีย์null
ก็ยังเป็นไปได้ว่าแผนที่อย่างชัดเจนแผนที่กุญแจสำคัญในการ การcontainsKey
ดำเนินการอาจใช้เพื่อแยกความแตกต่างสองกรณีนี้
ที่นี่เราเริ่มเห็นว่าการใช้null
สามารถทำให้สิ่งต่าง ๆ ซับซ้อนได้อย่างไร คำสั่งแรกบอกว่าถ้าคีย์ไม่ได้แมปnull
จะถูกส่งกลับ คำสั่งที่สองบอกว่าแม้ว่ากุญแจจะถูกแมปก็null
สามารถถูกส่งกลับ
ในทางตรงกันข้ามjava.util.Hashtable
ทำให้สิ่งต่าง ๆ ง่ายขึ้นโดยไม่อนุญาตให้ใช้null
คีย์และค่า ของมันV get(Object key)
ถ้าผลตอบแทนnull
, ไม่น่าสงสัยหมายความว่าที่สำคัญคือไม่ได้แมป
คุณสามารถอ่านส่วนที่เหลือของ API และค้นหาตำแหน่งและวิธีการnull
ใช้งาน โปรดจำไว้ว่าพวกเขาไม่ได้เสมอแนวปฏิบัติที่ดีที่สุดตัวอย่างไป
โดยทั่วไปnull
จะใช้เป็นค่าพิเศษในการสื่อความหมาย:
มันเป็นตัวแทนในหน่วยความจำได้อย่างไร?
ใน Java? ไม่มีความกังวลของคุณ และมันก็เป็นวิธีที่ดีที่สุด
null
สิ่งที่ดีหรือไม่?ตอนนี้เป็นเส้นเขตแดนแบบอัตนัย บางคนบอกว่าnull
เป็นสาเหตุของข้อผิดพลาดของโปรแกรมเมอร์มากมายที่สามารถหลีกเลี่ยงได้ บางคนบอกว่าในภาษาที่จับNullPointerException
จาวาเหมือนกันมันก็ดีที่จะใช้เพราะคุณจะล้มเหลวอย่างรวดเร็วในข้อผิดพลาดของโปรแกรมเมอร์ บางคนหลีกเลี่ยงnull
โดยใช้รูปแบบวัตถุ Nullเป็นต้น
นี่เป็นหัวข้อใหญ่ในตัวของมันเองดังนั้นจึงเป็นการสนทนาที่ดีที่สุดเพื่อตอบคำถามอื่น
ฉันจะจบเรื่องนี้ด้วยคำพูดจากนักประดิษฐ์ของnull
ตัวเองCAR Hoare (จากชื่อเสียงอันโด่งดัง):
ฉันเรียกมันว่าผิดพันล้านดอลลาร์ มันเป็นสิ่งประดิษฐ์ของการ
null
อ้างอิงในปี 1965 ในเวลานั้นฉันกำลังออกแบบระบบชนิดที่ครอบคลุมแรกสำหรับการอ้างอิงในภาษาเชิงวัตถุ (ALGOL W) เป้าหมายของฉันคือเพื่อให้แน่ใจว่าการใช้การอ้างอิงทั้งหมดควรจะปลอดภัยอย่างยิ่งโดยการตรวจสอบดำเนินการโดยอัตโนมัติโดยคอมไพเลอร์ แต่ฉันไม่สามารถต้านทานสิ่งล่อใจที่จะใส่ในการnull
อ้างอิงเพียงเพราะมันง่ายที่จะใช้ สิ่งนี้นำไปสู่ข้อผิดพลาดมากมายช่องโหว่และระบบล่มซึ่งอาจทำให้เกิดความเจ็บปวดและความเสียหายนับพันล้านดอลลาร์ในช่วงสี่สิบปีที่ผ่านมา
วิดีโอนำเสนอนี้ไปลึก; มันเป็นนาฬิกาที่แนะนำ
NIL
) ในปี 1960 และอาจเร็วกว่านี้ แต่ผมไม่คิดว่าโฮร์เป็นจริงๆพยายามที่จะเรียกร้องสิ่งประดิษฐ์ของการอ้างอิงโมฆะในอ้างว่า
โมฆะเป็นตัวอย่างของอะไร?
เลขที่นั่นคือเหตุผลที่null instanceof X
จะกลับมาสำหรับทุกชั้นfalse
X
(อย่าหลงกลโดยความจริงที่ว่าคุณสามารถกำหนดให้null
กับตัวแปรที่มีประเภทเป็นประเภทวัตถุได้พูดอย่างเคร่งครัดการมอบหมายนั้นเกี่ยวข้องกับการแปลงประเภทโดยนัย; ดูด้านล่าง)
ชุด 'null' เป็นของอะไร
มันเป็นสมาชิกหนึ่งเดียวเท่านั้นของประเภท null ที่กำหนดประเภท null ดังนี้:
"นอกจากนี้ยังมีชนิด null พิเศษชนิดของนิพจน์ null ซึ่งไม่มีชื่อเนื่องจากประเภท null ไม่มีชื่อจึงไม่สามารถประกาศตัวแปรประเภท null หรือส่งเป็นประเภท null ได้ null การอ้างอิงเป็นเพียงค่าที่เป็นไปได้ของการแสดงออกของประเภทโมฆะการอ้างอิงที่เป็นโมฆะสามารถนำไปใช้กับประเภทการอ้างอิงใด ๆ ได้ในทางปฏิบัติโปรแกรมเมอร์สามารถเพิกเฉยต่อชนิดของโมฆะและแกล้งทำเป็นว่า ประเภทอ้างอิง " JLS 4.1
ว่างเปล่าคืออะไร?
ดูด้านบน. ในบริบทบางอย่างnull
ใช้เพื่อแสดงว่า "ไม่มีวัตถุ" หรือ "ไม่รู้จัก" หรือ "ไม่พร้อมใช้งาน" แต่ความหมายเหล่านี้เป็นแอปพลิเคชันเฉพาะ
มันเป็นตัวแทนในหน่วยความจำได้อย่างไร?
นั่นคือการใช้งานเฉพาะและคุณจะไม่สามารถเห็นการเป็นตัวแทนnull
ในโปรแกรมจาวาบริสุทธิ์ (แต่null
จะแสดงเป็นเครื่องที่อยู่ / ตัวชี้ศูนย์ในที่สุดถ้าไม่ใช่การใช้งานจาวาทั้งหมด)
ว่างเปล่าคืออะไร?
มันไม่มีอะไร.
โมฆะเป็นตัวอย่างของอะไร?
ไม่เป็นไม่มีอะไรมันไม่สามารถเป็นตัวอย่างของสิ่งใดได้
ชุดใดเป็นโมฆะเป็นของ?
ไม่มีชุดใด ๆ
มันเป็นตัวแทนในหน่วยความจำได้อย่างไร?
หากมีการอ้างอิงชี้ไปที่:
Object o=new Object();
ในหน่วยความจำฮีปพื้นที่ที่กำหนดให้กับวัตถุที่สร้างขึ้นใหม่ และ o จะชี้ไปที่พื้นที่ที่กำหนดในหน่วยความจำ
ตอนนี้ o=null;
ซึ่งหมายความว่าตอนนี้ o จะไม่ชี้ไปยังพื้นที่หน่วยความจำของวัตถุนั้น
ไม่มันไม่ใช่อินสแตนซ์ของอะไรเลยอินสแตนซ์ของมันจะเป็นเท็จเสมอ
คำสำคัญที่เป็นโมฆะเป็นตัวอักษรที่หมายถึงการอ้างอิงเป็นโมฆะซึ่งไม่ได้อ้างอิงถึงวัตถุใด ๆหนึ่งที่ไม่ได้หมายถึงวัตถุใดnull เป็นค่าเริ่มต้นของตัวแปรประเภทการอ้างอิง
อาจจะดู
Null ไม่ใช่ตัวอย่างของคลาสใด ๆ
อย่างไรก็ตามคุณสามารถกำหนดค่า Null ให้กับตัวแปรประเภทใด ๆ (วัตถุหรืออาร์เรย์):
// this is false
boolean nope = (null instanceof String);
// but you can still use it as a String
String x = null;
"abc".startsWith(null);
Null ใน Java (tm)
ใน C และ C ++ "NULL" เป็นค่าคงที่ที่กำหนดในไฟล์ส่วนหัวโดยมีค่าดังนี้:
0
หรือ:
0L
หรือ:
((void*)0)
ขึ้นอยู่กับตัวเลือกรูปแบบคอมไพเลอร์และหน่วยความจำ NULL ไม่ได้พูดอย่างเคร่งครัดส่วนหนึ่งของ C / C ++ เอง
ใน Java (tm) "null" ไม่ใช่คำหลัก แต่เป็นตัวอักษรพิเศษของประเภท null มันสามารถส่งไปยังประเภทการอ้างอิงใด ๆ แต่ไม่สามารถพิมพ์แบบดั้งเดิมใด ๆ เช่น int หรือบูลีน ตัวอักษร null ไม่จำเป็นต้องมีค่าเป็นศูนย์ และมันเป็นไปไม่ได้ที่จะส่งไปเป็นโมฆะหรือประกาศตัวแปรประเภทนี้
การเป็นตัวแทน Bytecode
Java's null
มีการสนับสนุน JVM โดยตรง: สามคำสั่งถูกใช้เพื่อนำไปใช้งาน:
aconst_null
: เช่นการตั้งค่าตัวแปรnull
เป็นในObject o = null;
ifnull
และifnonnull
: เช่นเพื่อเปรียบเทียบวัตถุกับnull
ในif (o == null)
บทที่ 6 "ชุดคำสั่ง Java Virtual Machine"แล้วกล่าวถึงผลกระทบของnull
คำแนะนำอื่น ๆ : มันส่งผลNullPointerException
ต่อหลาย ๆ อย่าง
2.4 "ประเภทและค่าอ้างอิง"ยังกล่าวถึงnull
ในแง่ทั่วไป:
ค่าอ้างอิงอาจเป็นการอ้างอิงโมฆะพิเศษการอ้างอิงถึงไม่มีวัตถุซึ่งจะแสดงเป็นโมฆะที่นี่ การอ้างอิงโมฆะในตอนแรกไม่มีประเภทของเวลาทำงาน แต่อาจถูกแปลงไปเป็นประเภทใดก็ได้ ค่าเริ่มต้นของประเภทการอ้างอิงเป็นโมฆะ
null
เป็นค่าพิเศษมันไม่ใช่ตัวอย่างของอะไรเลย ด้วยเหตุผลที่ชัดเจนมันไม่สามารถเป็นinstanceof
อะไรได้
null
เป็นค่าพิเศษที่ไม่ได้เป็นตัวอย่างของคลาสใด ๆ นี่คือตัวอย่างของโปรแกรมต่อไปนี้:
public class X {
void f(Object o)
{
System.out.println(o instanceof String); // Output is "false"
}
public static void main(String[] args) {
new X().f(null);
}
}
null
String
void f(String o)
มันจะสมเหตุสมผลมากกว่า
null ใน Java เหมือนกับ / คล้ายกับ nullptr ใน C ++
โปรแกรมใน C ++:
class Point
{
private:
int x;
int y;
public:
Point(int ix, int iy)
{
x = ix;
y = iy;
}
void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
Point* p = new Point(3,5);
if (p != nullptr)
{
p->print();
p = nullptr;
}
else
{
std::cout << "p is null" << std::endl;
}
return 0;
}
โปรแกรมเดียวกันใน Java:
public class Point {
private int x;
private int y;
public Point(int ix, int iy) {
x = ix;
y = iy;
}
public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
public static void main(String[] args) {
Point p = new Point(3,5);
if (p != null)
{
p.print();
p = null;
}
else
{
System.out.println("p is null");
}
}
}
ตอนนี้คุณเข้าใจจากโค้ดข้างต้นว่าเป็นโมฆะใน Java คืออะไร? ถ้าไม่ใช่ฉันขอแนะนำให้คุณเรียนรู้พอยน์เตอร์ใน C / C ++ แล้วคุณจะเข้าใจ
โปรดทราบว่าใน C ซึ่งแตกต่างจาก C ++ นั้น nullptr นั้นไม่ได้ถูกกำหนด แต่จะใช้ NULL แทนซึ่งสามารถใช้ใน C ++ ด้วยเช่นกัน แต่ใน C ++ nullptr นั้นจะดีกว่า NULL มากกว่าเพราะ NULL ใน C นั้นเกี่ยวข้องกับพอยน์เตอร์เสมอ มันดังนั้นใน C ++ คำต่อท้าย "ptr" จึงถูกต่อท้ายคำและตัวอักษรทั้งหมดเป็นตัวพิมพ์เล็ก แต่ตอนนี้มีความสำคัญน้อยกว่า
ใน Java ตัวแปรทุกประเภทของคลาสที่ไม่ใช่แบบดั้งเดิมมักจะอ้างอิงถึงวัตถุประเภทนั้นหรือที่สืบทอดมาและ null คือการอ้างอิงวัตถุคลาส null แต่ไม่ใช่ตัวชี้โมฆะเพราะใน Java ไม่มีสิ่งใดที่ "ตัวชี้" แต่อ้างอิงถึงคลาส วัตถุถูกนำมาใช้แทนและ null ใน Java เกี่ยวข้องกับการอ้างอิงวัตถุคลาสดังนั้นคุณสามารถเรียกมันว่า "nullref" หรือ "nullrefobj" แต่นี่ยาวมากดังนั้นจึงเรียกมันว่า "null"
ใน C ++ คุณสามารถใช้พอยน์เตอร์และค่า nullptr สำหรับสมาชิก / ตัวแปรทางเลือกเช่นสมาชิก / ตัวแปรที่ไม่มีค่าและถ้ามันไม่มีค่าดังนั้นมันจะเท่ากับ nullptr ดังนั้นจึงสามารถใช้ null ใน Java ได้
มีสองประเภทหลักของประเภทที่อยู่ใน Java: ดั้งเดิมและการอ้างอิง ตัวแปรที่ประกาศถึงค่าที่เก็บประเภทดั้งเดิม ตัวแปรที่ประกาศของการอ้างอิงที่เก็บชนิดการอ้างอิง
String x = null;
ในกรณีนี้คำสั่งเริ่มต้นประกาศตัวแปร“ x” “ x” เก็บการอ้างอิงสตริง มันเป็นโมฆะที่นี่ ก่อนอื่น null ไม่ใช่อินสแตนซ์ของวัตถุที่ถูกต้องดังนั้นจึงไม่มีการจัดสรรหน่วยความจำ เป็นเพียงค่าที่ระบุว่าการอ้างอิงวัตถุไม่ได้อ้างอิงถึงวัตถุในขณะนี้
วิธีที่น่าสนใจที่จะเห็น null ใน java ในความคิดของฉันคือการมองว่ามันเป็นสิ่งที่ไม่ได้หมายถึงการขาดข้อมูล แต่เพียงแค่เป็นค่าตามตัวอักษรที่สามารถกำหนดให้อ้างอิงประเภทใดก็ได้ ถ้าคุณคิดเกี่ยวกับมันถ้ามันแสดงว่าไม่มีข้อมูลดังนั้น a1 == a2 จะเป็นจริงไม่สมเหตุสมผล (ในกรณีที่พวกเขาทั้งคู่ได้รับค่าว่าง) เพราะพวกเขาสามารถชี้ไปที่วัตถุใด ๆ (เราเพียงแค่ ไม่ทราบว่าวัตถุควรชี้ไปที่ใด) ... โดยวิธี null == null จะส่งกลับค่าจริงใน java ถ้า java เช่นจะเหมือนกับ SQL: 1999 แล้ว null == null จะส่งคืนค่าที่ไม่รู้จัก (ค่าบูลีนใน SQL: 1999 สามารถใช้ค่าสามค่า: จริง, เท็จและไม่รู้จัก แต่ในทางปฏิบัติที่ไม่รู้จักถูกนำมาใช้เป็น null ในระบบจริง) ... http://en.wikipedia.org/wiki/SQL
คำตอบสั้น ๆ และแม่นยำที่ตอบคำถามของคุณอย่างเป็นทางการจาก JLS:
3.10.7 ตัวอักษร Null
ชนิด null มีหนึ่งค่าการอ้างอิงค่า null แสดงด้วยค่า null ตามตัวอักษร null ซึ่งเกิดขึ้นจากอักขระ ASCII
ตัวอักษร null เป็นประเภท null เสมอ
มีการจัดสรรการอ้างอิงประเภทที่กำหนดให้เป็นโมฆะเท่านั้น คุณไม่ได้กำหนดค่าใด ๆ (วัตถุ) ให้กับการอ้างอิง การจัดสรรดังกล่าวมีความเฉพาะเจาะจงกับ JVM จะใช้การอ้างอิงจำนวนเท่าใดและพื้นที่หน่วยความจำใดที่จะถูกจัดสรร