2014-07-14 5 views
65

मैं एंड्रॉइड स्टूडियो को आजमाने की कोशिश कर रहा हूं। जब मैं गिट को कोड करने का प्रयास करता हूं, तो एक नई परियोजना बनाने और डिफ़ॉल्ट onSaveInstanceState विधि को जोड़ने के लिए, मुझे एक अजीब त्रुटि मिलती है जिसे मैं समझ नहीं पा रहा हूं।एंड्रॉइड स्टूडियो त्रुटि का अर्थ: एनोटेटेड पैरामीटर ओवरराइड @NonNull पैरामीटर

त्रुटि मैं यह है:: कोड यह है

enter image description here

अगर मैं protected void onSaveInstanceState(@NotNull Bundle outState) लिए विधि हस्ताक्षर बदलने की कोशिश, तो आईडीई मुझसे कहता है यह नहीं कर सकते प्रतीक NotNull को हल करें।

चेतावनी से छुटकारा पाने के लिए मुझे क्या करने की ज़रूरत है?

+0

आयात करें '@ नोट नूल'? – chrylis

उत्तर

85

यह एक एनोटेशन है, लेकिन सही नाम NonNull है:

protected void onSaveInstanceState(@NonNull Bundle outState) 

(और यह भी)

import android.support.annotation.NonNull; 

उद्देश्य है जब कुछ मान्यताओं का उल्लंघन किया जा संकलक चेतावनी देने के लिए अनुमति देने के लिए (जैसे किसी विधि का पैरामीटर जिसमें हमेशा एक मान होना चाहिए, जैसा कि इस विशेष मामले में है, हालांकि अन्य हैं)। Support Annotations प्रलेखन से:

The @NonNull annotation can be used to indicate that a given parameter can not be null.

If a local variable is known to be null (for example because some earlier code checked whether it was null), and you pass that as a parameter to a method where that parameter is marked as @NonNull, the IDE will warn you that you have a potential crash.

वे स्थिर विश्लेषण के लिए उपकरण हैं। रनटाइम व्यवहार बिल्कुल बदल नहीं है।


इस मामले में, विशेष रूप से चेतावनी है कि मूल विधि आप (Activity में) अधिभावी रहे outState पैरामीटर पर एक @NonNull एनोटेशन है है, लेकिन आप अधिभावी विधि में शामिल नहीं किया था। बस, यह समस्या को हल करना चाहिए जोड़ने अर्थात

@Override 
protected void onSaveInstanceState(@NonNull Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 
+4

इसका उद्देश्य क्या है? –

+1

@IgorGanapolsky क्षमा करें, इसका उल्लेख नहीं किया गया था क्योंकि मुझे लगता है कि सवाल केवल 'NotNull'/'NonNull' अंतर के बारे में था। तदनुसार समायोजित उत्तर। – matiash

+2

दूसरे शब्दों में, आईएमएचओ, यह एनोटेशन फ़ंक्शन के अंदर शून्य-जांच की आवश्यकता को हटा सकता है, और एक तेज कोड है। –

11

उपयोगी support annotations की संख्या हाल ही में एंड्रॉयड समर्थन पुस्तकालय में जोड़ा गया था। उनकी प्राथमिक भूमिका बग पकड़ने में मदद के लिए विभिन्न विधियों और मानकों के गुणों को एनोटेट करना है। उदाहरण के लिए, यदि आप NotNull एनोटेशन के साथ चिह्नित पैरामीटर के लिए null मान पास करते हैं तो आपको एक चेतावनी मिलेगी।

dependencies { 
    compile 'com.android.support:support-annotations:20.0.0' 
} 

आप चेतावनी हो रही है क्योंकि Bundle पैरामीटर @NotNull टिप्पणी के साथ और विधि एनोटेशन हो जाता है अधिभावी द्वारा चिह्नित है:

एनोटेशन निम्नलिखित निर्भरता जोड़कर Gradle साथ अपनी परियोजना में जोड़ा जा सकता छिपा हुआ। करने के लिए सही बात यह है कि ओवरराइड विधि के पैरामीटर में एनोटेशन जोड़ना भी है।

@Override 
protected void onSaveInstanceState(@NonNull Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 
6

अन्य उत्तर के अलावा, @NonNull (और यह प्रतिद्वंद्वी है, @Nullable) एनोटेशन एक क्षेत्र, पैरामीटर या विधि वापसी प्रकार टिप्पणी करता है। IntelliJ और इस प्रकार एंड्रॉइड स्टूडियो संकलन समय पर आपको NullPointerException एस के लिए चेतावनी दे सकता है।

एक उदाहरण यहाँ सबसे अच्छा है:

@NonNull private String myString = "Hello"; 

@Nullable private String myOtherString = null; 

@NonNull 
public Object doStuff() { 
    System.out.println(myString.length); // No warning 
    System.out.println(doSomething(myString).length); // Warning, the result might be null. 

    doSomething(myOtherString); // Warning, myOtherString might be null. 

    return myOtherString; // Warning, myOtherString might be null. 
} 

@Nullable 
private String doSomething(@NonNull String a) { 
    return a.length > 1 ? null : a; // No warning 
} 

ये टिप्पणियां क्रम व्यवहार में परिवर्तन नहीं है (हालांकि मैं इस के साथ experimented है), लेकिन कीड़े को रोकने के लिए एक उपकरण के रूप में सेवा।

ध्यान दें कि आपको प्राप्त संदेश एक त्रुटि नहीं थी, लेकिन अगर आप चुनते हैं तो केवल एक चेतावनी, जिसे अनदेखा करना सुरक्षित है। वैकल्पिक रूप से पैरामीटर को भी एनोटेट करना है, क्योंकि एंड्रॉइड स्टूडियो सुझाव देता है:

@Override 
protected void onSaveInstanceState(@NonNull Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 
संबंधित मुद्दे