නිදසුනක් ඇමතීමට පෙර ශුන්‍ය චෙක්පතක් අවශ්‍යද?


1362

ඇත null instanceof SomeClassනැවත falseහෝ විසි NullPointerException?


එකම වර්ගයේ ශුන්‍ය නොවන වස්තූන් මත පමණක් සාර්ථක වීමට නිර්මාණය කර ඇති ඕනෑම සංසන්දනයක් හෝ සමාන හෝ සමාන ක්‍රමයක් සඳහා 'හොඳම-පුහුණුවීම්' ආරම්භක (හෝ ඉතා ඉක්මණින්) රේඛාවක් ලෙස එය 'වැදගත්' හෝ අවම වශයෙන් ඉතා ප්‍රයෝජනවත් වේ. 'මෝඩ නඩු' වලින් එක පේළියකින් ඔබව ආරක්ෂා කරයි. අඩු කේතය = අඩු දෝෂ.

13
"මෙය ප්‍රයෝජනවත්ද?" විවාදය - මම කිසි විටෙකත් මගේම ජාවා කේතයක් ලියා නැත (එබැවින් පිරිවිතර කොතැනදැයි පහසුවෙන් නොදනී. පරීක්‍ෂණයක් සම්පාදනය කිරීම සුළුපටු නොවේ), නමුත් මම දැනට අතින් ජාවා ජාවාස්ක්‍රිප්ට් බවට පරිවර්තනය කරමි. මගේ කේතය ශුන්‍ය යොමු කිරීමකින් අසමත් වූ අතර, මෙය ගූගල් කිරීමෙන් පිළිගත් පිළිතුර බැලීමට මට ඉඩ ලබා දෙන අතර, එය අපේක්ෂිත හැසිරීම බවත්, ව්‍යාජ ශුන්‍ය චෙක්පතක් මට නොමැති බවත් තහවුරු විය. ඉතා ප්‍රයෝජනවත්, මගේ නඩුවේ.
ස්කොට් මර්මල්ස්ටයින්

Answers:


1853

නිදසුනක් ලෙස භාවිතා කිරීමට පෙර ශුන්‍ය පරීක්‍ෂණයක් අවශ්‍ය නොවේ.

ප්රකාශනය x instanceof SomeClassවේ falseනම් xවේnull .

ජාවා භාෂා පිරිවිතරයෙන්, 15.20.2 වගන්තියේ, “සංසන්දනය කිරීමේ ක්‍රියාකරු නිදසුන් ටයිප් කරන්න” :

"ධාවන වේලාවේදී, instanceofක්‍රියාකරුගේ ප්‍රති result ලය trueවනුයේ RelationalExpression හි අගය නොවේ නම්null සහ යොමු කිරීම යොමු නොකොට ReferenceType වෙත යොමු කළ හැකිය ClassCastException. එසේ නොවුවහොත් ප්‍රති result ලය වනු ඇත false."

එබැවින් ක්‍රියාකාරිත්වය ශුන්‍ය නම්, ප්‍රති result ලය අසත්‍ය වේ.


381
වර්තමාන හැසිරීම සහතික කළ හැසිරීමට සමාන නොවන try itනිසා මෙම පිළිතුර වඩා නිවැරදි ය .
ලූක්

3
මෙම ප්‍රශ්නය ක්‍රියාත්මක වන්නේ ජොෂුවා බ්ලොච්ගේ වස්තු සමානාත්මතාවය පිළිබඳ පරිච්ඡේදය තුළය Effective Java- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
කෙවින් මෙරඩිත්

17
නිශ්චිතවම, 8 වන අයිතමයේ, ඔහු සඳහන් කරන්නේ සමාන () ක්‍රම වලදී, එක් අවස්ථාවක ක්‍රියාකරු අරමුණු දෙකක් ඉටු කරයි - තර්කය ශුන්‍ය නොවන සහ නිවැරදි වර්ගයේ බව එය සනාථ කරයි. "... ඔබට වෙනම ශූන්‍ය චෙක්පතක් අවශ්‍ය නොවේ."
ඇන්ඩි තෝමස්

2
En බෙන්තර්ලි - ජාවා හි instanceofක්‍රියාකරු මීට වසර 20 කට පමණ පෙර නිකුත් කරන ලද ජාවා 1.0 හි කොටසකි. පවත්නා කේතය බිඳ දැමිය හැකි අයුරින් හැසිරීම දැන් වෙනස් කිරීම අපහසුය, එම විශාල පිරිවැය ඉක්මවා යන ප්‍රතිලාභයක් නොමැත. මීට වසර විස්සකට පෙර, තර්කය ඉදිරිපත් කළ හැකි නම් සත්‍යය නැවත ලබා ගැනීම සඳහා තර්ක තිබිය හැකිය, නැතහොත් ශුන්‍ය තර්කයක් සඳහා ව්‍යතිරේකයක් විසි කළ හැකිය. නමුත් එම නිර්වචන සඳහා වෙනම ශුන්‍ය චෙක්පත් අවශ්‍ය වනු ඇත.
ඇන්ඩි තෝමස්

3
En බෙන්තර්ලි - අතීත සහ වර්තමාන ජාවා පිරිවිතරයන් මගින් හැසිරීම සහතික කෙරේ. මම හිතන්නේ ලූක්ගේ කරුණ වර්තමානයේ සහතික කළ හැසිරීම තීරණය කිරීමේදී අත්හදා බැලීම්වල සීමාවන් ආමන්ත්‍රණය කරයි.
ඇන්ඩි තෝමස්

268

instanceofආපසු පැමිණීමේ පළමු මෙහෙයුම ලෙස ශුන්‍ය යොමු කිරීමක් භාවිතා කිරීම false.


272
(දැන් මෙම ප්‍රශ්නය ගූගල් හි සොයා ගැනීමට තත්පර 10 ක් ගතවේ)
PL_kolek

74

ඇත්තෙන්ම ඉතා හොඳ ප්‍රශ්නයක්. මම මා වෙනුවෙන් උත්සාහ කළා.

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 යනු නූල් ය, එය "String s" යැයි පවසන නිසා, එය ශුන්‍ය බැවින් එය නූල් නොවේ. ඉතින් මොන මගුලක්ද?
කයි වැන්ග්

1
Ai කයිවාන්ග් sයනු වස්තු යොමු විචල්‍යයකි. එය සැබවින්ම පවතින වස්තුවක් ( "") වෙත යොමු කළ හැකිය, නැතහොත් එය (ද) nullවචනානුසාරයෙන් යොමු විය හැකිය.
ජින් ක්වොන්

මම තවමත් ව්‍යාකූලයි. s දැන් අහෝසි විය හැකිය, නමුත් එය පෙන්වා දිය හැක්කේ පසුව සංගීත උදාහරණයකට පමණි. එය පූර්ණ සංඛ්‍යාවක් මෙන් පෙන්වා දිය නොහැක. එබැවින් එය තවමත් යම් ආකාරයක නූල් වර්ගයකි, එය පවා ශුන්‍යය. එතරම් තේරුමක් නැත ...
කයි වැන්ග්

Ai කයිවාන්ග් ඔබ විචල්‍ය වර්ගය සත්‍ය වස්තුවේ වර්ගය සමඟ පටලවා ගනී. විචල්‍යයන් නිදසුන් නොවේ; ඒවා effectively ලදායි ලෙස යොමු කරන්නන් පමණි. nullනූල් දත්ත නොවේ, කුමන විචල්‍යයට එය යොමු කළත්. උදාහරණයක් s instanceof Stringලෙස සමාන නොවේ field.getType().equals(String.class).
මැතිව්

ඔබ ඇමතුම බව සිතීම ඇති @KaiWang s instanceof Stringවන sබව බවට පත් එසේ සැබෑ වටිනාකම වෙනුවට ලක්වෙයි "" instanceof Stringහා null instanceof String. මේ ගැන සිතීම වඩාත් අර්ථවත් විය හැකිය.
ටිමෝ ටර්ෂ්මන්

24

නැහැ, එය එසේ නොවේ. එහි පළමු ක්‍රියාකාරිත්වය නම් instanceofනැවත පැමිණේ .falsenull


16

හුදෙක් ලෙස ඔන්න අරගන බලමු :

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


7

නැත . ජාවා වචනානුසාරයෙන් nullකිසිදු පන්තියක උදාහරණයක් නොවේ. එබැවින් එය කිසිදු පන්තියක උදාහරණයක් විය නොහැකිය. instanceof එක්කෝ ආපසු falseහෝtrue එම නිසා <referenceVariable> instanceof <SomeClass>ප්රතිලාභ falseවිට referenceVariableඅගය NULL වේ.


5
එම පැහැදිලි කිරීම අමුතු ලෙස චක්‍රලේඛයක් ලෙස පෙනේ ... නමුත් ඔබ අදහස් කරන්නේ කුමක්දැයි මම දනිමි :-)
ක්‍රිස්

අදහස් දැක්වීම සඳහා ක්‍රිස් ටයි ඔබ අදහස් කළ දේ මට ලැබුණි :). පිළිතුර ටිකක් සංස්කරණය කළා :).
සංවර්ධක මාරියස් Žilasnas

1

මෙම 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");
         }  
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.