2013-02-18 37 views
0

我使用sharedpreferences保存了一些變量,但是我的save方法使用空指針異常崩潰了應用程序。使用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,爲什麼這不起作用?

編輯:這裏是logcat的

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) 

save方法是上方和線:

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

是線856 updateLevelUp是被調用的播放器的水平時的方法當屏幕退出時,遊戲繼續並調用save()。

+3

發佈堆棧跟蹤。哪一行是空的? – 2013-02-18 17:20:57

+1

考慮保存對'safeFile.edit()'的引用並調用'commit()'一次。 – Sam 2013-02-18 17:21:46

+0

「loadSave」在邏輯上似乎爲空 – EvZ 2013-02-18 17:21:50

回答

0

作爲一個很好的規則,您希望在管理SharedPreferences時使用SharedPreferences.Editor

這裏有一個簡單的方法:

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(); 
} 

此外,如果你仍然可以得到這個實現後一個空指針,請確保您發佈的日誌,所以我們可以追蹤到異常。

+0

這是一個很好的提示,但我不認爲它應該改變任何東西。 – 2013-02-18 17:30:28

+0

首先,他沒有發佈日誌,這意味着我們甚至不知道問題是什麼。乍一看,我發現唯一有問題的是多次調用edit()和commit(),大多數commit()調用將成爲問題的常見原因。 – 2013-02-18 17:35:26

1

您的context變量是null。確保它已被初始化,並且您沒有在相應的ContextonCreate()之前調用此代碼。

+0

對不起,我該怎麼辦? – user2005938 2013-02-18 21:06:11

+0

@ user2005938將其設置爲您的活動或應用程序上下文。或者甚至更好,直接在其位置使用'getApplicationContext()' – 2013-02-18 21:17:24

+0

如何將它設置爲應用程序上下文? getApplicationContext()不適用於我。 – user2005938 2013-02-18 21:29:16