एंड्रॉइड स्टूडियो त्रुटि का अर्थ: एनोटेट नहीं किया गया पैरामीटर @NonNull पैरामीटर को ओवरराइड करता है


104

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

मुझे जो त्रुटि मिलती है वह यह है:

यहां छवि विवरण दर्ज करें

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

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

जवाबों:


124

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

protected void onSaveInstanceState(@NonNull Bundle outState)

(और भी)

import android.support.annotation.NonNull;

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

@NonNullएनोटेशन से संकेत मिलता है कि किसी दिए गए पैरामीटर नल नहीं हो सकता इस्तेमाल किया जा सकता।

यदि किसी स्थानीय चर को अशक्त माना जाता है (उदाहरण के लिए क्योंकि कुछ पहले वाले कोड की जाँच की गई थी कि क्या यह अशक्त था), और आप इसे एक विधि के पैरामीटर के रूप में पास करते हैं जहाँ उस पैरामीटर को @NonNull के रूप में चिह्नित किया जाता है, तो IDE आपको चेतावनी देगा कि आप हैं एक संभावित दुर्घटना।

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


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

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

5
इसका उद्देश्य क्या है?
इगोरगानापोलस्की

2
@IgorGanapolsky क्षमा करें, का उल्लेख नहीं किया था कि क्योंकि मैं मान लिया प्रश्न केवल के बारे में था NotNull/ NonNullअंतर। तदनुसार उत्तर दिया।
मत्तीश

2
दूसरे शब्द में, IMHO, यह एनोटेशन एक फ़ंक्शन के अंदर अशक्त-जांच को हटा सकता है, और एक तेज़ कोड हो सकता है।
जॉन पैंग

1
@JohnPang आप कर सकते हैं , लेकिन चूंकि एनोटेशन द्वारा निहित प्रतिबंध वास्तव में लागू होने की गारंटी नहीं है, इसलिए यह एक अच्छा विचार नहीं हो सकता है।
मटियाश

import android.support.annotation.NonNull; 2 घंटे के लिए इस चीज़ की तलाश ... नॉननॉल आयात करने के तरीके का उल्लेख नहीं किया गया है .. इसलिए upvote
शिरीष हेरवाडे

15

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

निम्नलिखित निर्भरता को जोड़कर ग्रैडल के साथ एनोटेशन को आपकी परियोजना में जोड़ा जा सकता है:

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

आपको चेतावनी मिल रही है क्योंकि Bundleपैरामीटर को @NotNullएनोटेशन के साथ चिह्नित किया गया है और विधि को ओवरराइड करके एनोटेशन छिपा हुआ है। सही बात यह है कि एनोटेशन को ओवरराइड विधि के पैरामीटर के साथ भी जोड़ा जाए।

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

9

अन्य उत्तरों के अलावा, @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
}

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

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

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.