จะnull instanceof SomeClass
กลับมาfalse
หรือโยนNullPointerException
?
จะnull instanceof SomeClass
กลับมาfalse
หรือโยนNullPointerException
?
คำตอบ:
ไม่ไม่จำเป็นต้องตรวจสอบ null ก่อนใช้งาน instanceof
การแสดงออกx instanceof SomeClass
คือfalse
ถ้าเป็นx
null
จากข้อกำหนดภาษา Java, ส่วน 15.20.2, "ตัวดำเนินการเปรียบเทียบอินสแตนซ์ของ" :
"ณ รันไทม์ผลลัพธ์ของ
instanceof
โอเปอเรเตอร์คือtrue
ถ้าค่าของRelational Expression ไม่ได้null
และการอ้างอิงอาจส่งไปยังReferenceType โดยไม่ต้องเพิ่ม aClassCastException
มิฉะนั้นจะเกิดผลลัพธ์false
"
ดังนั้นถ้าตัวถูกดำเนินการเป็นโมฆะผลลัพธ์จะเป็นเท็จ
try it
เพราะพฤติกรรมในปัจจุบันไม่ได้เป็นเช่นเดียวกับพฤติกรรมการรับประกัน
Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceof
ผู้ดำเนินการของ Java เป็นส่วนหนึ่งของ Java 1.0 เผยแพร่เกือบ 20 ปีที่ผ่านมา การเปลี่ยนพฤติกรรมในขณะนี้ในลักษณะที่จะทำลายรหัสที่มีอยู่นั้นไม่น่าเป็นไปได้โดยขาดประโยชน์บางอย่างที่มากกว่าค่าใช้จ่ายจำนวนมาก ยี่สิบปีที่ผ่านมาอาจจะมีข้อโต้แย้งสำหรับการคืนค่าจริงถ้าอาร์กิวเมนต์สามารถโยนหรือโยนข้อยกเว้นสำหรับอาร์กิวเมนต์ว่าง แต่คำจำกัดความเหล่านั้นจะต้องมีการตรวจสอบ null แยกต่างหาก
ใช้อ้างอิงโมฆะเป็นตัวถูกดำเนินการครั้งแรกที่ผลตอบแทนinstanceof
false
คำถามที่ดีมากแน่นอน ฉันแค่ลองเอง
public class IsInstanceOfTest {
public static void main(final String[] args) {
String s;
s = "";
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
s = null;
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
}
}
พิมพ์
true
true
false
false
JLS / 15.20.2 ตัวดำเนินการเปรียบเทียบชนิดของอินสแตนซ์
ในเวลาทำงานผลมาจากการที่
instanceof
ผู้ประกอบการคือtrue
ถ้าค่าของRelationalExpressionไม่ได้null
และการอ้างอิงอาจถูกโยนไปReferenceTypeClassCastException
โดยไม่ต้องยกfalse
มิฉะนั้นผลที่ได้คือ
API / Class # isInstance (Object)
ถ้า
Class
วัตถุนี้แสดงถึงอินเตอร์เฟสวิธีการนี้จะคืนค่าtrue
ถ้าคลาสหรือซูเปอร์คลาสใด ๆ ของObject
อาร์กิวเมนต์ที่ระบุใช้อินเทอร์เฟซนี้ มันกลับมาเป็นfalse
อย่างอื่น หากนี่วัตถุหมายถึงชนิดดั้งเดิมวิธีนี้ผลตอบแทนClass
false
s
เป็นเพียงตัวแปรอ้างอิงวัตถุ มันอาจอ้างถึงวัตถุที่มีอยู่จริง ( ""
) หรืออาจอ้างอิงถึง (ที่) null
อ้างอิงตามตัวอักษร
null
ไม่ใช่ข้อมูลสตริงไม่ว่าตัวแปรจะชี้ไปที่ใด ตัวอย่างเช่นs instanceof String
ไม่เหมือนกัน field.getType().equals(String.class)
s instanceof String
s
"" instanceof String
null instanceof String
ไม่มันไม่ใช่. instanceof
จะกลับมาถ้าตัวถูกดำเนินการครั้งแรกของมันคือfalse
null
เช่นเดียวกับอาหารอันโอชะ :
แม้จะกลับมา(
((A)null)
instanceof A)
false
(หากการพิมพ์ดีดnull
น่าแปลกใจบางครั้งคุณต้องทำเช่นในสถานการณ์เช่นนี้:
public class Test
{
public static void test(A a)
{
System.out.println("a instanceof A: " + (a instanceof A));
}
public static void test(B b) {
// Overloaded version. Would cause reference ambiguity (compile error)
// if Test.test(null) was called without casting.
// So you need to call Test.test((A)null) or Test.test((B)null).
}
}
ดังนั้นTest.test((A)null)
จะพิมพ์a instanceof A: false
)
PS: ถ้าคุณกำลังจ้างงานอย่าใช้คำถามนี้เป็นคำถามสัมภาษณ์งาน : D
ไม่ Java literal null
ไม่ใช่ตัวอย่างของคลาสใด ๆ ดังนั้นจึงไม่สามารถเป็นอินสแตนซ์ของคลาสใดก็ได้ instanceof
จะกลับอย่างใดอย่างหนึ่งfalse
หรือtrue
ดังนั้น<referenceVariable> instanceof <SomeClass>
ผลตอบแทนfalse
เมื่อreferenceVariable
ค่าเป็นโมฆะ
instanceof
ผู้ประกอบการไม่จำเป็นต้องชัดเจนnull
ตรวจสอบที่มันไม่ได้โยนถ้าตัวถูกดำเนินการคือNullPointerException
null
ณ รันไทม์ผลลัพธ์ของinstanceof
โอเปอเรเตอร์เป็นจริงถ้าค่าของนิพจน์เชิงสัมพันธ์ไม่ได้null
และการอ้างอิงอาจถูกส่งไปยังชนิดของการอ้างอิงโดยไม่เพิ่มข้อยกเว้นการส่งคลาส
ถ้าตัวถูกดำเนินการเป็นnull
ที่instanceof
ผลตอบแทนที่ผู้ประกอบการfalse
และด้วยเหตุนี้การตรวจสอบอย่างชัดเจน null ไม่จำเป็น
ลองพิจารณาตัวอย่างด้านล่าง
public static void main(String[] args) {
if(lista != null && lista instanceof ArrayList) { //Violation
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}
การใช้งานที่ถูกต้องของinstanceof
ที่แสดงด้านล่าง
public static void main(String[] args) {
if(lista instanceof ArrayList){ //Correct way
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}