เหตุใดบรรทัดโค้ดต่อไปนี้จึงสร้าง NullPointerException
Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
ฉันเข้าใจว่ากำลังทำการแกะกล่องในวันที่ null
แต่ทำไม
โปรดทราบว่า
Long v = (Long) null;
ไม่ก่อให้เกิดข้อยกเว้น
เหตุใดบรรทัดโค้ดต่อไปนี้จึงสร้าง NullPointerException
Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
ฉันเข้าใจว่ากำลังทำการแกะกล่องในวันที่ null
แต่ทำไม
โปรดทราบว่า
Long v = (Long) null;
ไม่ก่อให้เกิดข้อยกเว้น
ดังนั้นจึงดูชัดเจนว่าคุณจะต้องใส่กล่องเมื่อเงื่อนไขเป็นจริงเท่านั้น และไม่ควรมีการใส่กล่องหากเงื่อนไขเป็นเท็จ อย่างไรก็ตาม นิพจน์ตัวดำเนินการแบบไตรภาคจะต้องมีประเภท คงที่ โดยเฉพาะ ดังนั้นเราจึงมี Long
และ long
JLS ระบุว่าผลลัพธ์จะเป็นแบบดั้งเดิม (เช่นกัน - ลองจินตนาการว่าตัวดำเนินการคือ +
หรือแม้แต่ ==
) ดังนั้นผู้ดำเนินการที่ประกอบไปด้วยจะบังคับแกะกล่อง และจากนั้นการมอบหมายงานจะทำให้เกิดการชกมวยเท่านั้น
หากคุณต้องแทนที่โค้ดด้วย if-else
ที่เทียบเท่า คุณก็จะมีการกำหนดจาก long
ถึง Long
และจาก Long
ถึง Long
ซึ่งจะไม่มีการแกะกล่องใดๆ และทำงานได้ดี
IIRC สิ่งนี้ครอบคลุมถึง Java Puzzlers ของ Bloch & Gafter
จาก JSL
- หากตัวถูกดำเนินการตัวที่สองและสามมีประเภทเดียวกัน (ซึ่งอาจเป็นประเภทว่าง) นั่นคือประเภทของนิพจน์เงื่อนไข
- หากตัวถูกดำเนินการตัวที่สองและสามตัวใดตัวหนึ่งเป็นประเภท
boolean
และอีกตัวเป็นประเภทBoolean
ดังนั้นประเภทของนิพจน์เงื่อนไขจะเป็นboolean
ในคำสั่งต่อไปนี้ ประเภทของตัวถูกดำเนินการตัวที่สองคือ long
และตัวที่สามคือ Long
Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
วิธีนี้จะได้ผลหากนิพจน์เป็นจริง
Long v= 1 == 1 ? Long.MAX_VALUE : (Long) null;
หรือคุณจะโยนมันก็ได้
Long v= 1 == 2 ? Long.valueOf(Long.MAX_VALUE) : (Long) null;
Long
ที่เป็นโมฆะ นักแสดงไม่ใช่ปัญหา คุณสามารถส่ง null
ไปยังวัตถุประเภทใดก็ได้ โปรดดูข้อมูลจำเพาะภาษา Java ส่วนที่ 5.5 ใต้หากการส่งไปยังประเภทการอ้างอิงไม่ใช่ข้อผิดพลาดเวลาคอมไพล์ มีหลายกรณี:
- person Paul; 15.12.2011
Long.MAX_VALUE
ของคุณเมื่อส่งคืนlong
- person BalusC   schedule 15.12.2011