Как лучше понять ошибку, чтобы исправить

Я получаю следующее сообщение об ошибке в LogCat:

   java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

Я знаю, что такое исключение NullPointerException, но не на 100% о том, как это исправить в отношении передачи правильного контекста. Ошибка возникает только в том случае, когда приложение работает в фоновом режиме (многозадачность). Пожалуйста, LogCat и оскорбительный код ниже. Спасибо

Logcat:

Process: com.app.app, PID: 17519
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
    at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:537)
    at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:526)
    at com.app.app.DatabaseHandling.UpdateData.<init>(UpdateData.java:70)
    at com.app.app.PushService.PushReceiver$1.run(PushReceiver.java:94)
    at java.lang.Thread.run(Thread.java:764)

PushReceiver

UpdateData updateData = new UpdateData(MainActivity.mainActivity);

UpdateData:

 private final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MainActivity.mainActivity);

3 ответа

Решение

Я предполагаю, что проблема заключается в том, что вы пытаетесь инициализировать sp SharedPreferences в том месте, где вы его определяете. Вы должны определить это сначала как:

private SharedPreferences sp;

После этого установите эту глобальную переменную sp в функции, подобной "onReceive(Context context)":

sp = PreferenceManager.getDefaultSharedPreferences(context);

Или, как уже упоминалось в самой Activity в функции "onCreate(...)":

sp = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);

Проблема может заключаться в том, что вы пытаетесь инициализировать переменную с контекстом (например, действием), который недоступен в данный момент, но на более позднем этапе жизненного цикла.

И избегайте передачи контекста, предоставленного статической переменной из другого класса.

Скорее всего (на основе предоставленного ограниченного примера, который даже не указывает, в каком контексте выполняется этот код), это должно быть:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);

потому что нельзя просто создать статические поля, которые не существуют -

при назначении Context классы (так Activity или же Context) чтобы static Поля вообще плохая практика... и их следует избегать, когда только возможно.

Сначала вы должны проверить свой код. вы передаете MainActivity.mainAcitvity вместо MainACtivity.this или getApplicationContext()

private final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MainActivity.mainActivity);

всегда передавайте контекст активности, в которой работает ваш метод...

Другие вопросы по тегам