Ошибка сохранения с использованием SharedPreferences

Я сохраняю несколько переменных, используя общие настройки, но мой метод сохранения приводит к сбою приложения с исключением нулевого указателя.

public void save() {

    SharedPreferences sp = context.getSharedPreferences(saveFile, Context.MODE_PRIVATE);
    //Use the editor for easier management, no calling edit and commit so many times. 
    SharedPreferences.Editor editor = sp.edit();

    editor.putInt("X", player.getX());
    editor.putInt("Y", player.getY());
    editor.putInt("level", player.getLevel());
    editor.putFloat("xp", player.getXp());
    editor.commit();
}

getSharedPreferences() не работает сам по себе и должен иметь контекст. до этого, что может быть проблемой. У меня определен контекст, импортированы SharedPreferences, так почему это не работает?

EDIT: вот логарифм

02-18 20:21:49.958: E/AndroidRuntime(1005): FATAL EXCEPTION: Thread-89
02-18 20:21:49.958: E/AndroidRuntime(1005): java.lang.NullPointerException
02-18 20:21:49.958: E/AndroidRuntime(1005): at com.package.game.GameScreen.save(GameScreen.java:856)
02-18 20:21:49.958: E/AndroidRuntime(1005): at com.package.game.GameScreen.updateLevelUp(GameScreen.java:364)

Метод сохранения выше и строка:

SharedPreferences sp = context.getSharedPreferences(saveFile, Context.MODE_PRIVATE);

это строка 856. updateLevelUp — это метод, который вызывается, когда уровень игрока повышается, и когда этот экран закрывается, игра возобновляется и вызывается save().


person user2005938    schedule 18.02.2013    source источник
comment
Выложите трассировку стека. Какая строка пустая?   -  person Raghav Sood    schedule 18.02.2013
comment
Попробуйте сохранить ссылку на safeFile.edit() и один раз вызвать commit().   -  person Sam    schedule 18.02.2013
comment
loadSave логически кажется нулевым   -  person EvZ    schedule 18.02.2013
comment
@EvZ Может быть context, players, может быть, даже одним из возвращаемых значений.   -  person Sam    schedule 18.02.2013
comment
@Sam Правда, это был быстрый ответ.   -  person EvZ    schedule 18.02.2013
comment
Вторая строка пуста, и loadSave определяется как public static final String loadSave = gameSave;   -  person user2005938    schedule 18.02.2013


Ответы (2)


Ваша переменная context равна null. Убедитесь, что он был инициализирован и что вы не вызываете этот код до onCreate() соответствующего Context.

person Raghav Sood    schedule 18.02.2013
comment
Извините, а на что его поставить? - person user2005938; 19.02.2013
comment
@user2005938 user2005938 Установите его либо в контекст действия, либо в контекст приложения. Или, что еще лучше, используйте вместо него getApplicationContext(). - person Raghav Sood; 19.02.2013
comment
Как мне установить его в контекст приложения? getApplicationContext() у меня не работает. - person user2005938; 19.02.2013
comment
В любом случае вы бы установили его с помощью context = getApplicationContext(). Что вы имеете в виду, говоря, что это не работает для вас? Где вы вызываете этот код? - person Raghav Sood; 19.02.2013
comment
Когда я делаю Context context = getApplicationContext(); он говорит, что метод getApplicationContext не определен. - person user2005938; 19.02.2013
comment
В каком классе этот код? Это деятельность, услуга или широковещательный приемник? - person Raghav Sood; 19.02.2013

Как правило, вы хотите использовать SharedPreferences.Editor при управлении SharedPreferences.

Вот более простой способ:

public void save() {
    SharedPreferences saveFile = context.getSharedPreferences(loadSave, Context.MODE_PRIVATE);
    //Use the editor for easier management, no calling edit and commit so many times. 
    SharedPreferences.Editor editor = saveFile.edit();

    editor.putInt("x", player.get());
    editor.putInt("Y", player.getY());
    editor.putInt("level", player.getLevel());
    editor.putFloat("xp", player.getXp());

    //Save changes now
    editor.commit();
}

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

person daniel_c05    schedule 18.02.2013
comment
Это хороший совет, но я не думаю, что он должен что-то изменить. - person A--C; 18.02.2013
comment
Во-первых, он не выложил лог, то есть мы даже не знаем точно, в чем проблема. На первый взгляд, единственное, что я считаю проблематичным, это вызов edit() и commit() несколько раз, в основном вызов commit() был бы частой причиной проблем. - person daniel_c05; 18.02.2013