ไม่กี่วันที่ผ่านมาฉันพบกับสถานการณ์ที่น่าสนใจที่ฉันไม่สามารถหาเอกสารใด ๆ เกี่ยวกับว่า Java ให้เหตุผลต่อไปนี้ได้หรือไม่ (ตัวอย่างข้อมูลนี้เป็นเพียงรูปแบบของข้อบกพร่อง)
@Test
public void test() {
boolean bool = false;
Integer intVal = Integer.valueOf(5);
Long longVal = null;
Long result = bool ? intVal : longVal;
System.out.println(" > " + result);
}
ในตัวอย่างด้านบน:
ถ้า bool = true คุณจะได้ค่า '5'
แต่ถ้า bool = false คุณจะได้รับข้อยกเว้นตัวชี้ null เมื่อพยายามประเมินการดำเนินการแบบไตรภาค ไม่ใช่คำสั่งพิมพ์
ในการแก้ไขปัญหานี้ฉันแค่เปลี่ยน 'ผลลัพธ์' เป็น
Long result = bool ? Long.valueOf(intVal) : longVal;
การทำเช่นนี้จะให้พฤติกรรมตามที่ฉันต้องการ:
ถ้า bool = true คุณจะได้ค่า '5'
แต่ถ้า bool = false คุณจะได้ 'null'
ตอนนี้ส่วนที่สนุกคือถ้าคุณแยกสิ่งนี้เป็นคำสั่ง if / else ปกติแล้ว java จะไม่อนุญาตให้คุณคอมไพล์
longVal = intVal;
แต่มันก็ไม่ได้จับผ่านทางผู้ประกอบการที่สาม ดังนั้น Java กำลังทำอะไรเพื่อให้เป็นศูนย์ในข้อมูลโค้ดต้นฉบับ
(java 11)