2016-02-24 8 views
7

उत्पन्न कर सकता है निम्न स्निपेट एंड्रॉइड स्टूडियो में लिंट चेतावनी उत्पन्न करता है।Dereference 'java.lang.NullPointerException'

Bundle extras = getIntent().getExtras(); 
    if (extras != null && extras.getString(REDIRECT_KEY) != null) { 
     switch (extras.getString(REDIRECT_KEY)) { ... 

extras.getString(REDIRECT_KEY) चेतावनी के

enter image description here

भिन्नता 'extras.getString (REDIRECT_KEY)' का उत्पादन हो सकता 'java.lang.NullPointerException'

लेकिन मैं डॉन का उत्पादन यह कोई परिदृश्य नहीं दिखता है जहां यह हो सकता है। क्या यह लिंट चेक में एक बग है, यह बस मेरे नल-चेक को पहले में नहीं पहचानता है? या मुझे कुछ याद आती है?

संपादित करें: निम्न के कोड में परिवर्तन, चेतावनी

if(getIntent() != null && getIntent().getStringExtra(REDIRECT_KEY) != null){ 
     switch (getIntent().getStringExtra(REDIRECT_KEY)){ 
      ... 
     } 
    } 

को दूर किया था लेकिन यह केवल चला गया है क्योंकि जिस तरह से, इस फाहा जाँच काम करता है (कम से कम मुझे लगता है)। अगर मैं इस चेक को अधिक infos दिखाने के लिए, यह एक बिंदु पर कहते हैं

चर, विधि मानकों और मान (या नहीं-अशक्त क्रमशः) @Nullable के रूप में चिह्नित या @NotNull नल के रूप में इलाज कर रहे हैं और के दौरान इस्तेमाल किया nullability जाँच करने के लिए विश्लेषण

अनुबंध बंडल की और आशय का स्रोत कोड को देखते हुए पता चलता है:

/** 
* Retrieve extended data from the intent. 
* 
* @param name The name of the desired item. 
* 
* @return the value of an item that previously added with putExtra() 
* or null if no String value was found. 
* 
* @see #putExtra(String, String) 
*/ 
public String getStringExtra(String name) { 
    return mExtras == null ? null : mExtras.getString(name); 
} 

और BaseBundle

/** 
* Returns the value associated with the given key, or null if 
* no mapping of the desired type exists for the given key or a null 
* value is explicitly associated with the key. 
* 
* @param key a String, or null 
* @return a String value, or null 
*/ 
@Nullable 
public String getString(@Nullable String key) { 
    unparcel(); 
    final Object o = mMap.get(key); 
    try { 
     return (String) o; 
    } catch (ClassCastException e) { 
     typeWarning(key, o, "String", e); 
     return null; 
    } 
} 

जैसा कि आप देख सकते हैं, बेसबंडल अपने वापसी मूल्यों को @Nullable पर सेट करता है, जबकि इरादा नहीं करता है। इसलिए getStringExtra का उपयोग केवल symoptoms को हटा देता है, कारण नहीं। मुझे अभी भी लगता है कि यह मेरी तरफ गलत कोडिंग के बजाय अपर्याप्त लिंट चेक के कारण होता है। या क्या कोई अभी भी एक परिदृश्य देखता है, जहां एक नल पॉइंटर फेंक दिया जा सकता है?

+0

यह चेतावनी कौन सी रेखा देता है? दूसरा या तीसरा? – Ferrybig

+2

मुझे लगता है कि एक्स्ट्रा से हर बार स्ट्रिंग प्राप्त करने के बजाय, आपको इसे एक चर के लिए असाइन करना चाहिए। क्योंकि कुछ अतिरिक्त स्थितियों पर आपका अतिरिक्त शून्य हो सकता है।स्निपेट में – Pragnani

+0

तीसरी पंक्ति, या छवि में लाइन 80। मैं extras == शून्य के लिए और getString() == शून्य के परिणाम के लिए जाँच कर रहा हूँ। दूसरी पंक्ति में देखें। – AlbAtNf

उत्तर

4

विधि का तर्क() के लिए javac द्वारा उत्पन्न इस उदाहरण here

class Argument { 

    public final static int TOMAYTO = 0; 
    public final static int TOMAHTO = 1; 

    static void argue() { 

     int say = TOMAYTO; 

     while (true) { 

      switch (say) { 

      case TOMAYTO: 

       say = TOMAHTO; 
       break; 

      case TOMAHTO: 

       say = TOMAYTO; 
       break; 
      } 
     } 
    } 
} 

bytecodes से लिया पर एक नजर डालें नीचे दिखाया गया हैं:

0 iconst_0 // Push constant 0 (TOMAYTO) 
    1 istore_0 // Pop into local var 0: int say = TOMAYTO; 
    2 iload_0 // Push key for switch from local var 0 
          // Perform switch statement: switch (say) {... 
          // Low case value is 0, high case value is 1 
          // Default branch offset will goto 2 
    3 tableswitch 0 to 1: default=2 
      0: 24 // case 0 (TOMAYTO): goto 24 
      1: 29 // case 1 (TOMAHTO): goto 29 

          // Note that the next instruction starts at address 24, 
          // which means that the tableswitch took up 21 bytes 
    24 iconst_1 // Push constant 1 (TOMAHTO) 
    25 istore_0 // Pop into local var 0: say = TOMAHTO 
    26 goto 2 // Branch unconditionally to 2, top of while loop 
    29 iconst_0 // Push constant 1 (TOMAYTO) 
    30 istore_0 // Pop into local var 0: say = TOMAYTO 
    31 goto 2 // Branch unconditionally to 2, top of while loop 

आप देख सकते हैं के साथ स्विच बयान के लिए स्ट्रिंग डेटा प्रकार एक टेबलविच किया जाता है, और प्रत्येक मामले के लिए स्विच के लिए पारित मूल्य की गणना केस के मूल्य से की जाती है, तो इसका मतलब यह है कि आपके मामले में extras.getString आपके पिछलेके बिना कई बार कहा जा सकता हैचेक कहा जा रहा है, और जैसे कि अतिरिक्त एक बंडल है, वहां एक मौका है जिसे इसे संदर्भित किया जा सकता है और एक नलपॉइंटर अपवाद का कारण बन सकता है।

विधि के एकाधिक कॉल करने के बजाए स्थानीय चर बनाने के लिए हमेशा एक अच्छा अभ्यास है, आप समझने के लिए this presentation by Jake Wharton पर एक नज़र डाल सकते हैं।

+1

धन्यवाद, क्योंकि यह एकमात्र उत्तर है जो वास्तव में मेरे मूल प्रश्न का उत्तर देता है "क्या मुझे कुछ याद आया"। – AlbAtNf

संबंधित मुद्दे