Android: SharedPreferences иногда вызывает ошибку NullPointException

Я опубликовал свое приложение и обнаружил, что SharedPreferences иногда несколько раз вызывает исключение NullPointException. В основном работает хорошо. Я до сих пор не понимаю причину и когда возникает ошибка.

Мой код и журнал такие.

Activity

protected void onCreate(...) {
    super.onCreare(savedInstanceState);
    setContentView(R.layout.activity_layout);

   // NullPointException here
    ASharedPreferences.saveCurrentNumber();
    ASharedPreferences.getCurrentNumber();
}

ASharedPreferences.java

public class ASharedPreferences {

    private static final String PREF_NAME = 'Number';
    private static ASharedPreferences sInstance;
    private static SharedPreferences sSharedPref;
    private static SharedPreferences.Editor sEditor;

    private ASharedPreferences(Context context) {
        sSharedPref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        sEditor = sSharedPref.edit();
    }


    public static void init(Context context) {
        if (sInstance == null) {
            sInstance = new ASharedPreferences(context);
        }
    }

    public static void saveCurrentNumber() {
        sEditor.putInt("current_number", getCurrentNumber() + 1);
        sEditor.apply();
    }

    public static int getCurrentNumber() {
        return sSharedPref.getInt("current_number", 0);
    }

}

Лог здесь. Но кажется бесполезным.

Caused by: java.lang.NullPointerException:

at com...ASharedPreferences.getCurrentNumber (ASharedPreferences.java:30)

at com.ASharedPreferences.saveCurrentNumber (ASharedPreferences.java:25)

at com...Activity.onCreate (Activity.java:63)

Почему это вызывает исключение NullPointException, хотя для него установлено значение по умолчанию?

В чем причина возможно?

Обновлять

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ASharedPreferences.init(this);
}

Вы инициализировали класс ASharedPreferences методом init?

Edric 30.06.2019 07:12

@ Эдрик Да, конечно. В первом действии оно инициализируется. Как я уже упоминал выше, в основном это работает хорошо. Эта ошибка иногда случается.

Ooto 30.06.2019 07:30

Можете поделиться кодом инициализации?

Anupam 30.06.2019 07:34

@ Zachary Я поставил часть. Пожалуйста, взгляните.

Ooto 30.06.2019 07:40

Проверяю сейчас

Anupam 30.06.2019 07:58

Попробуйте решение Gowtham. Он должен работать.

Anupam 30.06.2019 08:08

@ Zachary Я знаю, что это тоже работает. Но безопаснее ли это, чем мой подход?

Ooto 01.07.2019 05:34

Поскольку вы используете MODE_PRIVATE, все в порядке.

Anupam 01.07.2019 05:41

@ Закари, извините, я имею в виду, этот подход с меньшей вероятностью вызовет ошибку?

Ooto 01.07.2019 07:44

да. попробуйте. Это должно работать нормально

Anupam 01.07.2019 07:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте этот подход вместо создания экземпляра класса.

protected void onCreate(...) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_layout);

   // NullPointException here
    ASharedPreferences.saveCurrentNumber(MyActivity.this);
    int n=ASharedPreferences.getCurrentNumber(MyActivity.this);
}
public class ASharedPreferences {

    private static final String PREF_NAME = 'Number';

    public static void saveCurrentNumber(Context context) {
        SharedPreferences sSharedPref=context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
       SharedPreferences.Editor sEditor=sSharedPref.edit();
        sEditor.putInt("current_number", getCurrentNumber(context) + 1);
        sEditor.apply();
    }

    public static int getCurrentNumber(Context context) {
       SharedPreferences sSharedPref=context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
       SharedPreferences.Editor sEditor=sSharedPref.edit();
        return sSharedPref.getInt("current_number", 0);
    }

}

попробую сделать так. Не могли бы вы объяснить, почему этот подход с меньшей вероятностью вызовет ошибку?

Ooto 01.07.2019 16:24

Ключевое слово Static в Java предназначено для переменной, метода и внутренних классов для совместного использования ресурсов с несколькими объектами. Не для самого объекта. И тогда здесь нет необходимости создавать экземпляр. И подход Singleton без синхронизации может привести к созданию нескольких экземпляров в многопоточное приложение. Попробуйте мой ответ и опубликуйте обновление в комментариях.

Gowtham K K 01.07.2019 16:46

Хорошо, спасибо, я посмотрю, хорошо ли это работает. Это займет время.

Ooto 01.07.2019 16:50

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