ทำไมตัวชี้โมฆะแทนการส่งคลาส


26

ใน Java:

int count = (Integer) null;

พ่น java.lang.NullPointerException

เหตุใดจึงไม่โยนข้อยกเว้น Class Cast เพื่อความสะดวกในการทำความเข้าใจโปรแกรมเมอร์

เหตุใดจึงเลือกข้อยกเว้นนี้นอกเหนือจากข้อยกเว้นอื่น ๆ

คำตอบ:


46

เมื่อรันโค้ดของคุณรันไทม์ Java จะทำสิ่งต่อไปนี้:

  1. เพี้ยนเป็นวัตถุของคลาสจำนวนเต็ม
  2. ลอง unbox วัตถุจำนวนเต็มเพื่อ int โดยการเรียกวิธีการ intValue ()
  3. การเรียกใช้เมธอดบนวัตถุ null จะส่ง NullPointerException

กล่าวอีกนัยหนึ่ง null สามารถถูกส่งไปยัง Integer โดยไม่มีปัญหา แต่วัตถุจำนวนเต็ม null ไม่สามารถแปลงเป็นค่าชนิด int ได้

แก้ไข

ผมมีคำถามที่เกี่ยวข้องในขณะที่ที่ผ่านมาที่กองมากเกินดูที่นี่


1

Java สำเร็จ casts null ให้กับการอ้างอิงจำนวนเต็มซึ่งอ้างอิงว่าไม่มีวัตถุใด ๆ

ไม่เป็นไรเพราะเป็นสถานะที่ไม่ถูกต้องสำหรับการอ้างอิง

เป็นการเรียกวิธีการของวัตถุที่ไม่มีอยู่ซึ่งไม่สามารถทำได้

การแสดง(Integer)nullนั้นเหมือนกับการประกาศตัวแปรจำนวนเต็มจากนั้นไม่สามารถกำหนดอินสแตนซ์อ็อบเจ็กต์ Integer แบบใหม่ (หรือที่มีอยู่แล้ว) ให้ใหม่ได้


-1

เพื่อ unbox Integerเป็นintเช่นในint i = new Integer(15);, iจริงเท่ากับnew Integer(15).intValue() i = (Integer) o; อยู่ที่ไหนObject o = 15เหมือนกันo = Integer.valueOf(15);แต่i = null; พ่นNullPointerExceptionเพราะiนั้นเท่ากับ ที่พ่นnull.intValue()NullPointerException


2
คำตอบที่ได้รับการยอมรับเกือบสองปีที่ผ่านมาให้คำอธิบายที่เหมือนกันเกือบทั้งหมด แต่มีความชัดเจนมากขึ้น คำตอบนี้ยังไม่ถูกต้องสำหรับ Java 5+: ตอนนี้ใช้valueOf()วิธีการจากโรงงานแทนที่จะสร้างอินสแตนซ์ใหม่สำหรับมวย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.