【问题标题】:SharedPreferences returns null no matter what method I use无论我使用什么方法,SharedPreferences 都会返回 null
【发布时间】:2016-05-04 01:46:57
【问题描述】:

这里是初级 Java/Android 开发人员。我知道这是一个令人难以置信的过度提问的问题,但是我从我能找到的所有其他线程中尝试过的一切都不起作用。无论。它要么返回 null,要么根本不工作,并在用于获取 SharedPreferences 对象的行上抛出错误。如果这只是一个非常小的错误,我们深表歉意。

下面的完整堆栈跟踪和代码。

05-03 20:35:38.225 18928-18928/com.example.admin2.clicker E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.admin2.clicker, PID: 18928
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.admin2.clicker/com.example.admin2.clicker.Home}: java.lang.NullPointerException: Attempt to invoke interface method 'android.content.SharedPreferences$Editor android.content.SharedPreferences.edit()' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
 Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'android.content.SharedPreferences$Editor android.content.SharedPreferences.edit()' on a null object reference
    at com.example.admin2.clicker.Home.<init>(Home.java:50)
    at java.lang.Class.newInstance(Native Method)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1067)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

代码:

// Used to fetch SharedPreferences object
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    TextView xpText = (TextView) findViewById(R.id.xpText);
    TextView lvText = (TextView) findViewById(R.id.lvText);

    xpText.setText("Experience: 0/100");
    lvText.setText("Level 1");

    gameData = this.getSharedPreferences("gameData", MODE_PRIVATE);
}

// The line throwing the error + its context
{
    //boolean firstRun = gameData.getBoolean("f", false);
    boolean firstRun = true;
    if (firstRun) {
        SharedPreferences.Editor e = gameData.edit();
            e.putInt("xp", 0);
            e.putInt("mxp", 100);
            e.putInt("lv", 1);
            e.putInt("$", 0);
            e.putInt("$c", 0);
        e.apply();
    }
}

如果您有任何问题或需要更多信息,请告诉我。我不确定我需要提供的一切。谢谢。

【问题讨论】:

  • 您何时尝试使用gameData.edit()?您的代码似乎不完整。
  • @Grender gameData.edit() 用于检查应用程序是否首次运行。那里声明了一个编辑器 (SharedPreferences.Editor e = gameData.edit())。

标签: java android nullpointerexception sharedpreferences


【解决方案1】:

您将用于编辑首选项的代码块放在initializer block 中,这意味着它将在您实际为gameData 赋值的onCreate() 之前运行。这就是导致NullpointerException 的原因。

通常,在调用onCreate() 之前,您通常不应该对Activity 执行任何操作。特别是如果您正在做的事情需要Context,例如在处理偏好时。

要解决此问题,只需在将值分配给 gameData 后将初始化程序块中的代码移动到 onCreate() 方法中即可。

【讨论】:

    【解决方案2】:

    试试这个,你必须声明文件来保存你的数据,然后你只能编辑它。

    SharedPreferences pref;
    SharedPreferences.Editor editor;
    
    pref = getSharedPreferences("MyPref", 0); // 0 - for private mode
    editor = pref.edit();
    

    我使用 commit() 来更新我想保存在 SharedPreferences 中的任何数据。就像你的情况一样

     editor.putInt("xp", 0);
     editor.putInt("mxp", 100);
     editor.putInt("lv", 1);
     editor.putInt("$", 0);
     editor.putInt("$c", 0);
    
     editor.commit();
    

    我希望这会对你有所帮助。谢谢。

    【讨论】:

    • 刚刚尝试在分配之前初始化编辑器变量。声明编辑器本身确实 工作,但尝试使用 putInt 没有。监视器抛出Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'android.content.SharedPreferences$Editor android.content.SharedPreferences$Editor.putInt(java.lang.String, int)' on a null object reference
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2016-12-26
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多