ඇත null instanceof SomeClassනැවත falseහෝ විසි NullPointerException?
ඇත null instanceof SomeClassනැවත falseහෝ විසි NullPointerException?
Answers:
නිදසුනක් ලෙස භාවිතා කිරීමට පෙර ශුන්ය පරීක්ෂණයක් අවශ්ය නොවේ.
ප්රකාශනය x instanceof SomeClassවේ falseනම් xවේnull .
ජාවා භාෂා පිරිවිතරයෙන්, 15.20.2 වගන්තියේ, “සංසන්දනය කිරීමේ ක්රියාකරු නිදසුන් ටයිප් කරන්න” :
"ධාවන වේලාවේදී,
instanceofක්රියාකරුගේ ප්රති result ලයtrueවනුයේ RelationalExpression හි අගය නොවේ නම්nullසහ යොමු කිරීම යොමු නොකොට ReferenceType වෙත යොමු කළ හැකියClassCastException. එසේ නොවුවහොත් ප්රති result ලය වනු ඇතfalse."
එබැවින් ක්රියාකාරිත්වය ශුන්ය නම්, ප්රති result ලය අසත්ය වේ.
try itනිසා මෙම පිළිතුර වඩා නිවැරදි ය .
Effective Java- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceofක්රියාකරු මීට වසර 20 කට පමණ පෙර නිකුත් කරන ලද ජාවා 1.0 හි කොටසකි. පවත්නා කේතය බිඳ දැමිය හැකි අයුරින් හැසිරීම දැන් වෙනස් කිරීම අපහසුය, එම විශාල පිරිවැය ඉක්මවා යන ප්රතිලාභයක් නොමැත. මීට වසර විස්සකට පෙර, තර්කය ඉදිරිපත් කළ හැකි නම් සත්යය නැවත ලබා ගැනීම සඳහා තර්ක තිබිය හැකිය, නැතහොත් ශුන්ය තර්කයක් සඳහා ව්යතිරේකයක් විසි කළ හැකිය. නමුත් එම නිර්වචන සඳහා වෙනම ශුන්ය චෙක්පත් අවශ්ය වනු ඇත.
ඇත්තෙන්ම ඉතා හොඳ ප්රශ්නයක්. මම මා වෙනුවෙන් උත්සාහ කළා.
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හා සඳහන බක්කියට කළ හැකි ReferenceType මතු තොරවClassCastException. එසේ නොමැති නම් ප්රති result ලය වේfalse.
API / Class # isInstance (වස්තුව)
මෙම
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නැවත පැමිණේ .falsenull
හුදෙක් ලෙස ඔන්න අරගන බලමු :
පවා (((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: ඔබ කුලියට ගන්නේ නම්, කරුණාකර මෙය රැකියා සම්මුඛ පරීක්ෂණ ප්රශ්නයක් ලෙස භාවිතා නොකරන්න. : ඩී
නැත . ජාවා වචනානුසාරයෙන් nullකිසිදු පන්තියක උදාහරණයක් නොවේ. එබැවින් එය කිසිදු පන්තියක උදාහරණයක් විය නොහැකිය. instanceof එක්කෝ ආපසු falseහෝtrue එම නිසා <referenceVariable> instanceof <SomeClass>ප්රතිලාභ falseවිට referenceVariableඅගය NULL වේ.
මෙම instanceofක්රියාකරු පැහැදිලි අවශ්ය නොවේ nullඑය විසි කරන්නේ නැත ලෙස, චෙක්පත් NullPointerExceptionද යන අගයද නම්null .
ධාවන වේලාවේදී, instanceofසාපේක්ෂ ප්රකාශනයේ වටිනාකම එසේ නොවේ නම් ක්රියාකරුගේ ප්රති result ලය සත්ය වන nullඅතර පංති වාත්තු ව්යතිරේකයක් මතු නොකර යොමු යොමු වර්ගයට යොමු කළ හැකිය.
ක්රියාකාරීත්වය නම් null, instanceofක්රියාකරු නැවත පැමිණෙන falseඅතර, එබැවින් පැහැදිලි ශුන්ය චෙක්පත් අවශ්ය නොවේ.
පහත උදාහරණය සලකා බලන්න,
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");
}
}