8

हो जाता है मैं पूछने के लिए कारण है कि हम यह व्याख्या प्राप्त हैं:एंड्रॉयड:। GetContext() getContentResolver() कभी कभी NullPointerException

विधि मंगलाचरण getContext.getContentResolver() का उत्पादन हो सकता NullPointerException

क्यों है कार्यक्रम और टुकड़े टुकड़े/गतिविधि के अन्य हिस्सों में यह नहीं है? Google द्वारा बनाए गए ट्यूटोरियल में यह दृष्टिकोण उपयोग किया गया है - यहां सामग्री प्रदाता कोड https://github.com/udacity/Sunshine-Version-2/blob/sunshine_master/app/src/main/java/com/example/android/sunshine/app/data/WeatherProvider.java के लिए लिंक है, भले ही आप केवल एक खाली गतिविधि के साथ एक एपिकेशन बनाते हैं और उस विधि को नव निर्मित सामग्री प्रदाता में डाल दें।

क्या हमें getContext().getContentResolver().notifyChange(uri, null); सामग्री प्रदाता के बाहर यूरी पास करने के बाद उपयोग करना चाहिए और फिर अपडेट/डालने/हटाने के बाद अधिसूचना समाप्त हो गई है? या शायद हम इसे किसी भी तरह ठीक कर सकते हैं?

+0

यह सिर्फ एक सरल चेतावनी आपके आईडीई कि 'getContext()' 'null' लौट सकता है अगर है ठीक है और 'getContext()। getContentResolver() 'तब' NullPointerException' का कारण बन सकता है। – Tom

उत्तर

8

आप के स्रोत में देखें, तो ContentProvider (केवल SHIFT दबाएं और एंड्रॉइड स्टूडियो में क्लासनाम पर क्लिक करें) तो आप पाएंगे कि कार्यान्वयन प्रकार कॉन्टेक्स्ट का ऑब्जेक्ट mContext के रूप में रख रहा है।

आपका समाधान वही है, जिसका अर्थ है कि यदि ContentProvider का mContext शून्य है, तो आपका संदर्भ भी शून्य होगा। तो इसके लिए कोई ज़रूरत नहीं है।

आपकी मदद करने के लिए, यह आपके आईडीई की चेतावनी है अगर ऐसा स्वयं का निर्माण करें। लेकिन इस मामले में हमेशा संदर्भ होगा, क्योंकि ContentProvider आपके सिस्टम द्वारा उत्पन्न होता है।

... 
@SuppressWarnings("ConstantConditions") 
public class NoteProvider extends ContentProvider { 
... 
+0

पूरी कक्षा में इस तरह की चेतावनियों को अनदेखा करना वास्तव में बुरा विचार है, कम से कम आपको कोड की उस पंक्ति से पहले '// नोइन्सपीक्शन कॉन्स्टेंट कंडिशन' जैसी कुछ चीज़ों का उपयोग करना चाहिए - जो केवल कोड की अगली पंक्ति के लिए चेतावनी को बंद कर देता है – mmrmartin

2

लिखें getApplicationContext().getContentResolver() आशा है कि यह काम करेगा।

+1

मैं केवल 'getContext()। GetAplicationContext() प्राप्त कर सकता हूं। GetContentResolver(); 'और' getContext()। getAplicationContext() 'पार्टी एक ही परिणाम का उत्पादन कर रही है। –

7

क्या आप वाकई getContext() कभी नहीं हो सकता है कि अशक्त तो आप बस इस चेतावनी को अनदेखा कर सकते हैं कर सकते हैं। मुझे लगता है कि चेतावनी भी गायब हो जाता है की तुम सिर्फ अशक्त के लिए जाँच:

if (getContext() != null) { 
    getContext().getContentResolver(); 
} 

तुम बस अगर getContext()अशक्त है कोड निष्पादित नहीं किया जाएगा को ध्यान में रखना है।

चीयर्स

संपादित करें: इसका जवाब @Shivani गुप्ता आप दे दी है से सावधान रहें क्योंकि आप विभिन्न संदर्भों मिल सकता है । देखें: Difference between getContext() , getApplicationContext() , getBaseContext() and "this"

0

जब भी आप किसी सदस्य या ऑब्जेक्ट की विधि का उपयोग करने का प्रयास करते हैं, तो आपके पास ऑब्जेक्ट का रनटाइम अपवाद हो सकता है, जिसका सदस्य/विधि जिसका आप उपयोग करने का प्रयास करते हैं वह शून्य है। मान लें कि आप किसी ऑब्जेक्ट के सदस्य/विधि का उपयोग करना चाहते हैं, obj। यदि आप इसे इस तरह उपयोग करते हैं:

if (obj != null) { 
    //use members/methods of obj 
} 

तब आपने समस्या को रोका। हालांकि, अगर आप एक अपवाद के रूप में यह संभाल करने के लिए इस तरह चाहते हो सकता है:

try { 
    //use members/methods of obj 
} catch (NullPointerException npe) { 
    //handle the NullPointerException 
} 
0

ठीक है ऐसा लगता है मैं इसे अपने आप कक्षा की शुरुआत पर प्रसंग की घोषणा के द्वारा तय की।

public class NoteProvider extends ContentProvider { 
    Context context; 

तो onCreate()

@Override 
    public boolean onCreate() { 
     mSQLiteOpenHelper = new NoteDbHelper(getContext()); 
     context = getContext(); 

     return true; 
    } 

में यह आरंभ मुझे लगता है कि यह सुनिश्चित करें कि मैं हमेशा जब मैं का उपयोग प्रसंग है context.getContentResolver() बनाया notifyChange (uri, नल)। या retCursor.setNotificationUri (context.getContentResolver(), uri); डालने/अपडेट/हटाएं/क्वेरी विधि में- retCursor निर्दिष्ट विधियों द्वारा कर्सर वापस लौटाया जा रहा है।

मैंने अपने फोन पर आवेदन चलाया है और अभी तक कोई समस्या नहीं है यदि मैं शायद इस पोस्ट के लिए एक संपादन करूँगा।

संपादित करें:

यह सब के बाद एक फर्क नहीं करता है - @Mate द्वारा explanationin जवाब यह है कि मुझे लगता है कि के लिए धन्यवाद मैं इसे अब मिलता है:]

+1

आपका समाधान केवल आईडीई को धोखा दे रहा है, getContext आपको ContentProvider के mContext का संदर्भ देता है, यदि यह शून्य है तो आपका संदर्भ भी शून्य होगा। लेकिन चिंता न करें, यह शून्य नहीं हो सकता है, मेरा जवाब देखें। – Mate

0

ContentProvider getContext() docs के अनुसार::

प्रसंग इस प्रदाता में चल रहा है पुन: प्राप्त करता अपने आईडीई में त्रुटि से बचने के सिर्फ @SuppressWarnings ("ConstantConditions") की तरह अपने वर्ग परिभाषा ऊपर लिखें। केवल एक बार उपलब्ध कराएं() को कॉल किया गया है - यह कन्स्ट्रक्टर में शून्य वापस आ जाएगा।

तो getContext() विधि insert(), update() या delete() में null वापस नहीं करता है, क्योंकि onCreate() इन कॉल से पहले बुलाया जाएगा।

तो यह है कि लाइन के लिए उस चेतावनी को निष्क्रिय करने के लिए यदि आप इस तरह के मामले में इसका इस्तेमाल करते हैं ...

//noinspection ConstantConditions 
getContext().getContentResolver().notifyChange(uri, null); 
संबंधित मुद्दे