java.lang.NullPointerException SharedPreferences getSharedPreferences

时间:2014-05-16 18:57:09

标签: java android

所以我有一个非常奇怪的问题,可能很容易解决除了我以外的任何人;-) 无论如何,我正在进行许多活动,并且在每个活动中我都有问题要让它恢复正常,每个活动都要一个。

每当我启动那个活动,或者让那个活动进入睡眠并立即返回它时,它就可以正常工作。但是,当我把它放入睡眠时按下主页按钮并启动一堆不同的应用程序,然后尝试再次返回它,我在getSharedPreferences得到一个java.lang.NullPointerException。

这怎么可能发生? SharedPreferences会被删除吗?

这是我的getPreferences方法,其中发生错误:

private static SharedPreferences getPreferences() {
    Context applicationContext = App.getContextOfApplication();
    return applicationContext.getSharedPreferences(PREFS_USER, Context.MODE_PRIVATE);
}

这是我的logcat:

05-16 20:37:36.461: E/AndroidRuntime(13767): FATAL EXCEPTION: main
05-16 20:37:36.461: E/AndroidRuntime(13767): Process: com.test, PID: 13767
05-16 20:37:36.461: E/AndroidRuntime(13767): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test/com.test.MessageActivity}: java.lang.NullPointerException
05-16 20:37:36.461: E/AndroidRuntime(13767):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at android.app.ActivityThread.access$900(ActivityThread.java:161)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at android.os.Handler.dispatchMessage(Handler.java:102)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at android.os.Looper.loop(Looper.java:157)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at android.app.ActivityThread.main(ActivityThread.java:5356)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at java.lang.reflect.Method.invokeNative(Native Method)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at java.lang.reflect.Method.invoke(Method.java:515)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at dalvik.system.NativeStart.main(Native Method)
05-16 20:37:36.461: E/AndroidRuntime(13767): Caused by: java.lang.NullPointerException
05-16 20:37:36.461: E/AndroidRuntime(13767):    at com.test.LocalStorage.getPreferences(LocalStorage.java:30)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at com.test.LocalStorage.getUsername(LocalStorage.java:83)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at com.test.WebApi.getChat(WebApi.java:711)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at com.test.MessageActivity.onCreate(MessageActivity.java:100)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at android.app.Activity.performCreate(Activity.java:5426)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
05-16 20:37:36.461: E/AndroidRuntime(13767):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
05-16 20:37:36.461: E/AndroidRuntime(13767):    ... 11 more

提前感谢!

1 个答案:

答案 0 :(得分:0)

正如@Niek_Haarman指出的那样,你不能依赖对Context实例的静态引用,即使它是Application实例,因为Android系统可以销毁和重建ApplicationActivity个实例。因此,如果App.getContextOfApplication()返回一个静态变量值,那可能就是出错了。

是否有getPreferences()必须static的原因?如果您可以将其设为Activity的非静态方法,那么使用Activity本身作为Context应该没有问题:

private SharedPreferences getPreferences() {
    return getSharedPreferences(PREFS_USER, Context.MODE_PRIVATE);
}