ในฐานะของ Java 1.5 คุณสามารถแลกเปลี่ยนInteger
กับint
สถานการณ์ได้มากมาย
อย่างไรก็ตามฉันพบข้อบกพร่องที่อาจเกิดขึ้นในรหัสของฉันที่ทำให้ฉันประหลาดใจเล็กน้อย
รหัสต่อไปนี้:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
ดูเหมือนว่าจะตั้งค่าไม่ตรงกันอย่างไม่ถูกต้องเมื่อค่าเท่ากันแม้ว่าฉันจะไม่สามารถระบุได้ภายใต้สถานการณ์ใด ฉันตั้งเบรกพอยต์ใน Eclipse และเห็นว่าInteger
ค่าทั้ง 137 และฉันตรวจสอบการแสดงออกบูลีนและมันบอกว่ามันเป็นเท็จ แต่เมื่อฉันก้าวข้ามมันก็ตั้งค่าไม่ตรงกันเป็นจริง
การเปลี่ยนเงื่อนไขเป็น:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
แก้ไขปัญหา
มีใครเล่าให้ฟังว่าทำไมสิ่งนี้ถึงเกิดขึ้นได้บ้าง? จนถึงตอนนี้ฉันเพิ่งเห็นพฤติกรรมบนโลคัลโฮสต์ของฉันบนพีซีของฉันเอง ในกรณีนี้รหัสทำให้สำเร็จในการเปรียบเทียบประมาณ 20 ครั้ง แต่ล้มเหลวในวันที่ 2 ปัญหานี้สามารถทำซ้ำได้อย่างสม่ำเสมอ
หากเป็นปัญหาที่พบบ่อยก็ควรจะทำให้เกิดข้อผิดพลาดในสภาพแวดล้อมอื่น ๆ ของเรา (dev และทดสอบ) แต่จนถึงขณะนี้ยังไม่มีใครรายงานปัญหาหลังจากการทดสอบหลายร้อยดำเนินการตัวอย่างรหัสนี้
มันยังไม่ถูกต้องหรือไม่ที่จะใช้==
เพื่อเปรียบเทียบสองInteger
ค่า
นอกเหนือจากคำตอบที่ดีด้านล่างลิงค์ stackoverflow ต่อไปนี้มีข้อมูลเพิ่มเติมเล็กน้อย จริง ๆ แล้วมันจะตอบคำถามเดิมของฉัน แต่เนื่องจากฉันไม่ได้พูดถึงการโต้กลับอัตโนมัติในคำถามของฉันจึงไม่แสดงในคำแนะนำที่เลือก:
ทำไมคอมไพเลอร์ / JVM ไม่สามารถทำการ autoboxing“ แค่ทำงาน” ได้?