ปัญหาคือString.valueOf
วิธีนี้มีมากเกินไป :
Java Specification Language กำหนดว่าในกรณีเหล่านี้จะมีการเลือกโอเวอร์โหลดที่เฉพาะเจาะจงที่สุด :
ถ้าเมธอดสมาชิกมากกว่าหนึ่งวิธีสามารถเข้าถึงได้และใช้ได้กับการเรียกใช้เมธอดจำเป็นต้องเลือกวิธีใดวิธีหนึ่งเพื่อระบุตัวอธิบายสำหรับการจัดส่งเมธอดรันไทม์ ภาษาโปรแกรม Java ใช้กฎที่เลือกวิธีที่เฉพาะเจาะจงที่สุด
char[]
เป็นข้อ Object
แต่ไม่ทั้งหมดเป็น-AObject
char[]
ดังนั้นจึงchar[]
มีความเฉพาะเจาะจงมากกว่าObject
และตามที่ภาษา Java ระบุไว้การString.valueOf(char[])
โอเวอร์โหลดจะถูกเลือกในกรณีนี้
String.valueOf(char[])
คาดว่าอาร์เรย์จะไม่ใช่null
และเนื่องจากnull
ได้รับในกรณีนี้จึงพ่นNullPointerException
จะได้รับในกรณีนี้มันแล้วโยน
"แก้ไข" ที่ง่ายคือการโยนnull
อย่างชัดเจนObject
เป็นดังนี้:
System.out.println(String.valueOf((Object) null));
// prints "null"
คำถามที่เกี่ยวข้อง
นิทานสอนใจ
มีหลายสิ่งที่สำคัญ:
- มีผลบังคับใช้ Java 2nd Edition, รายการ 41: ใช้มากเกินไปอย่างรอบคอบ
- เพียงเพราะคุณสามารถทำงานหนักเกินไปไม่ได้หมายความว่าคุณควรทำทุกครั้ง
- อาจทำให้เกิดความสับสน (โดยเฉพาะอย่างยิ่งหากวิธีการทำสิ่งที่แตกต่างกันอย่างมาก)
- เมื่อใช้ IDE ที่ดีคุณสามารถตรวจสอบว่าโอเวอร์โหลดใดถูกเลือกในเวลาคอมไพล์
- กับคราสคุณสามารถเมาส์เลื่อนการแสดงออกดังกล่าวและเห็นว่าจริง ๆ แล้วที่
valueOf(char[])
เกินจะถูกเลือก!
- บางครั้งคุณต้องการแคสต์อย่างชัดเจน
null
(ตัวอย่างที่จะติดตาม)
ดูสิ่งนี้ด้วย
ในการคัดเลือกนักแสดง null
มีสถานการณ์อย่างน้อยสองสถานการณ์ที่null
จำเป็นต้องระบุประเภทการอ้างอิงอย่างชัดเจน:
- เพื่อเลือกการโอเวอร์โหลด (ตามตัวอย่างด้านบน)
- เพื่อให้
null
เป็นอาร์กิวเมนต์เดียวกับพารามิเตอร์ vararg
ตัวอย่างง่ายๆของหลังมีดังต่อไปนี้:
static void vararg(Object... os) {
System.out.println(os.length);
}
จากนั้นเราสามารถมีสิ่งต่อไปนี้:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
ดูสิ่งนี้ด้วย
คำถามที่เกี่ยวข้อง
null
ในกรณีนี้) ตรวจสอบให้แน่ใจว่าโอเวอร์โหลดทั้งสองทำหน้าที่เหมือนกันกับค่านั้น!