Android: getContext (). GetContentResolver () bekommt manchmal NullPointerException

Ich möchte fragen, warum wir diese Annotation bekommen:

Methodenaufruf getContext.getContentResolver () kann NullPointerException erzeugen

Warum ist es da und nicht in anderen Teilen des Programms Fragment / Aktivität? Dieser Ansatz wurde in Tutorial von Google verwendet – hier ist Link für ContentProvider Code https://github.com/udacity/Sunshine-Version-2/blob/sunshine_master/app/src/main/java/com/example/android /sunshine/app/data/WeatherProvider.java auch wenn du eine Applikation mit nur einer leeren Aktivität anfängst und diese Methode in einen neu erstellten ContentProvider steckst.

Sollten wir getContext().getContentResolver().notifyChange(uri, null); verwenden getContext().getContentResolver().notifyChange(uri, null); Außerhalb ContentProvider bekommen die uri passiert und dann nach dem Update / insert / delete ist fertig benachrichtigenChange? Oder vielleicht können wir es irgendwie beheben?

  • DialogFragment: NullPointerException (Unterstützungsbibliothek)
  • Getting Instrumentation Run fehlgeschlagen aufgrund 'java.lang.NullPointerException'
  • NullPointerException auf dem OnClickListener der Schaltfläche
  • Fehler beim Ausführen von Builder 'Android Resource Manager' auf ADT
  • Warum getApplicationContext () im Konstruktor von Activity throws null pointer Ausnahme?
  • - java.lang.NullPointerException - setText auf Nullobjektreferenz
  • NullPointerException in android.app.ActivityThread.handleStopActivity
  • Was ist ein NullPointerException, und wie kann ich es beheben?
  • 5 Solutions collect form web for “Android: getContext (). GetContentResolver () bekommt manchmal NullPointerException”

    Wenn Sie in die Quelle von ContentProvider schauen (halten Sie einfach SHIFT und klicken Sie auf den Klassennamen in Android Studio), dann finden Sie, dass die Implementierung ein Objekt vom Typ Kontext als mContext hält.

    Ihre Lösung ist genau das gleiche, was bedeutet, wenn mContext von ContentProvider null ist, wird Ihre Referenz auch null sein. Also dafür gibt es keine Notwendigkeit.

    Um Ihnen zu helfen, ist dies nur eine Warnung vor Ihrer IDE, wenn Sie ein solches Konstrukt selbst machen. Aber in diesem Fall wird es immer Kontext geben, denn der ContentProvider wird von Ihrem System generiert. Um den Fehler in deiner IDE zu vermeiden, schreibe einfach @SuppressWarnings ("ConstantConditions") über deiner Klassendefinition wie:

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

    Wenn Sie sicherstellen können, dass getContext () niemals null sein kann, dann können Sie diese Warnung einfach ignorieren. Ich denke, die Warnung verschwindet sogar von dir nur auf Null zu überprüfen:

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

    Sie müssen nur im Auge behalten, dass der Code nicht ausgeführt wird, wenn getContext () null ist .

    Prost

    Bearbeiten: Sei vorsichtig mit der Antwort @Shivani Gupta gab dir, weil du verschiedene Kontexte bekommen kannst. Siehe: Unterschied zwischen getContext (), getApplicationContext (), getBaseContext () und "this"

    Schreibe getApplicationContext().getContentResolver() Hoffe, das wird funktionieren.

    Wenn Sie versuchen, ein Mitglied oder eine Methode eines Objekts zu verwenden, können Sie eine Laufzeitausnahme haben, wenn das Objekt, dessen Mitglied / Methode Sie verwenden möchten, null ist. Nehmen wir an, Sie möchten ein Mitglied / eine Methode eines Objekts verwenden, obj . Wenn Sie es so verwenden:

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

    Dann hast du das problem verhindert Allerdings möchten Sie vielleicht es als Ausnahme behandeln, wie folgt:

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

    Ok, es scheint, ich habe es selbst festgelegt, indem ich Kontext auf den Anfang der Klasse erkläre.

     public class NoteProvider extends ContentProvider { Context context; 

    Dann initialisieren sie in onCreate ()

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

    Ich denke, das hat sichergestellt, dass ich immer Kontext habe, wenn ich context.getContentResolver () benutze. NotifyChange (uri, null); Oder retCursor.setNotificationUri (context.getContentResolver (), uri); In insert / update / delete / query method- retCursor wird der Cursor mit den genannten Methoden zurückgegeben.

    Ich habe die Anwendung auf meinem Handy ausgeführt und hatte noch keine Probleme, wenn ich dort wohl eine Bearbeitung für diesen Beitrag sein werde.

    BEARBEITEN:

    Es macht keinen Unterschied, nachdem alle – Erklärung von Antwort von @Mate, danke dafür, dass ich denke, ich bekomme es jetzt:]

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.