ඇත 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
නැවත පැමිණේ .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: ඔබ කුලියට ගන්නේ නම්, කරුණාකර මෙය රැකියා සම්මුඛ පරීක්ෂණ ප්රශ්නයක් ලෙස භාවිතා නොකරන්න. : ඩී
නැත . ජාවා වචනානුසාරයෙන් 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");
}
}