调用getDefaultSharedPreference时出现NullPointerException

时间:2014-10-19 10:47:59

标签: java android nullpointerexception

这是我在ContactActivity类中声明的内容

final SharedPreferences exceptionPrefs = PreferenceManager.getDefaultSharedPreferences(this);
exceptionPrefs.edit().putString("Exceptions", TextUtils.join(",", exceptions)).apply();

在另一个类(不是活动。它扩展BroadcastReceiver),尝试从SharedPreferenceonReceive()中使用此内容获取存储的值 -

SharedPreferences exceptionPositionPrefs = PreferenceManager.getDefaultSharedPreferences(new ContactActivity().getContext());

该行抛出NullPointerException。

另外,我必须添加onReceive包含另一个SharedPreferences对象,该对象从我的MainActivity接收值。

这是LogCat。

10-19 15:49:03.628: E/AndroidRuntime(24226): FATAL EXCEPTION: main
10-19 15:49:03.628: E/AndroidRuntime(24226): java.lang.RuntimeException: Unable to start receiver com.scimet.admin.driveon.RejectCall: java.lang.NullPointerException
10-19 15:49:03.628: E/AndroidRuntime(24226):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2146)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at android.app.ActivityThread.access$1500(ActivityThread.java:127)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at android.os.Looper.loop(Looper.java:137)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at android.app.ActivityThread.main(ActivityThread.java:4441)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at java.lang.reflect.Method.invokeNative(Native Method)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at java.lang.reflect.Method.invoke(Method.java:511)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at dalvik.system.NativeStart.main(Native Method)
10-19 15:49:03.628: E/AndroidRuntime(24226): Caused by: java.lang.NullPointerException
10-19 15:49:03.628: E/AndroidRuntime(24226):    at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:371)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:366)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at com.scimet.admin.driveon.RejectCall.onReceive(RejectCall.java:36)
10-19 15:49:03.628: E/AndroidRuntime(24226):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2139)
10-19 15:49:03.628: E/AndroidRuntime(24226):    ... 10 more

2 个答案:

答案 0 :(得分:0)

您永远不应该实例化一个活动类并从那里获取上下文。实际上你不应该实例化一个活动期;您应该使用startActivity来处理活动生命周期。

为什么你这样做呢,BroadcastReceiver确实得到了提供给onReceive方法的上下文,你不能只使用那个上下文来检索你的SharedPreference吗?

答案 1 :(得分:0)

您使用的偏好在所有活动之间共享。

PreferenceManager.getDefaultSharedPreferences(ctx);

如果ctx是MainActivity或ContactActivity,上述内容将返回相同的偏好

所以基本上你可以用BroadcastReceiver从你可用的上下文中调用它。


如果您想获得与活动相关的偏好,那么您应该致电Context.getPreferences()