Я опубликовал свое приложение и обнаружил, что 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);
}
@ Эдрик Да, конечно. В первом действии оно инициализируется. Как я уже упоминал выше, в основном это работает хорошо. Эта ошибка иногда случается.
Можете поделиться кодом инициализации?
@ Zachary Я поставил часть. Пожалуйста, взгляните.
Проверяю сейчас
Попробуйте решение Gowtham. Он должен работать.
@ Zachary Я знаю, что это тоже работает. Но безопаснее ли это, чем мой подход?
Поскольку вы используете MODE_PRIVATE, все в порядке.
@ Закари, извините, я имею в виду, этот подход с меньшей вероятностью вызовет ошибку?
да. попробуйте. Это должно работать нормально




Попробуйте этот подход вместо создания экземпляра класса.
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);
}
}
попробую сделать так. Не могли бы вы объяснить, почему этот подход с меньшей вероятностью вызовет ошибку?
Ключевое слово Static в Java предназначено для переменной, метода и внутренних классов для совместного использования ресурсов с несколькими объектами. Не для самого объекта. И тогда здесь нет необходимости создавать экземпляр. И подход Singleton без синхронизации может привести к созданию нескольких экземпляров в многопоточное приложение. Попробуйте мой ответ и опубликуйте обновление в комментариях.
Хорошо, спасибо, я посмотрю, хорошо ли это работает. Это займет время.
Вы инициализировали класс
ASharedPreferencesметодомinit?