当我使用 sharedpreference 获取数据时给出 NullPointerException [重复]

Posted

技术标签:

【中文标题】当我使用 sharedpreference 获取数据时给出 NullPointerException [重复]【英文标题】:giving NullPointerException when I getting data using sharedpreference [duplicate] 【发布时间】:2017-07-08 01:19:33 【问题描述】:

在片段类中编写的SharedPreferences代码。这是我的代码

SharedPreferences preferences = getActivity().getPreferences(Context.MODE_PRIVATE);

public void saveData(String name)
    Log.e("saved",name);
    editor = preferences.edit();
    editor.putString("Text",name);
    editor.commit();

public String getData()
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
    String text = preferences.getString("Text", null);
    Log.e("save",text);
    return text;

这就是我从其他活动中调用 getData() 方法的方式

Stt stt = new Stt();
String name = stt.getData();

我不明白这个问题。为什么我在调用 getData() 方法时收到 nullpointerexception。我认为我的数据已成功存储。当我使用 Log 检查时,我在 saveData() 中得到了正确的字符串。

这是我的日志

FATAL EXCEPTION: main`java.lang.RuntimeException: Unable to start activity `ComponentInfocom.example.kartikeya_pc.sample/com.example.kartikeya_pc.sample.NaturalLanguage: java.lang.NullPointerException
                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2114)
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2139)
                                                                               at android.app.ActivityThread.access$700(ActivityThread.java:143)
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                               at android.os.Looper.loop(Looper.java:137)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:4960)
                                                                               at java.lang.reflect.Method.invokeNative(Native Method)
                                                                               at java.lang.reflect.Method.invoke(Method.java:511)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
                                                                               at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
                                                                               at dalvik.system.NativeStart.main(Native Method)
                                                                            Caused by: java.lang.NullPointerException
                                                                               at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:371)
                                                                               at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:366)
                                                                               at com.example.kartikeya_pc.sample.Stt.getData(Stt.java:404)
                                                                               at com.example.kartikeya_pc.sample.NaturalLanguage.onCreate(NaturalLanguage.java:28)
                                                                               at android.app.Activity.performCreate(Activity.java:5203)
                                                                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2078)
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2139) 
                                                                               at android.app.ActivityThread.access$700(ActivityThread.java:143) 
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                               at android.os.Looper.loop(Looper.java:137) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:4960) 
                                                                               at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                               at java.lang.reflect.Method.invoke(Method.java:511) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
                                                                               at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) 
                                                                               at dalvik.system.NativeStart.main(Native Method) `
                                                                           `

【问题讨论】:

看到这个帖子:***.com/questions/12074156/… 我用过这个,但我仍然遇到同样的问题。使用后我已经添加了我的日志。 【参考方案1】:

在您的getData 方法中,为什么不使用:

 SharedPreferences preferences = getActivity().getPreferences(Context.MODE_PRIVATE);

【讨论】:

【参考方案2】:

问题是您正在写入不同的文件并从不同的文件中读取数据

从文档中:如果您使用 getActivity().getPreferences(Context.MODE_PRIVATE),您将获得一个带有引用活动名称的 sharedpref 文件。

SharedPreferences getPreferences(整数模式)

检索一个 SharedPreferences 对象以访问首选项 此活动专用。这只是简单地调用底层 通过传入此活动的 getSharedPreferences(String, int) 方法 类名作为首选项名称。

使用 PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()) 您将获得完全不同的由框架管理的 sharedpref 文件。

SharedPreferences getDefaultSharedPreferences(上下文上下文)

获取一个 SharedPreferences 实例,该实例指向给定上下文中首选项框架使用的默认文件。

【讨论】:

以上是关于当我使用 sharedpreference 获取数据时给出 NullPointerException [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SharedPreferences无法在活动中使用

安卓SharedPreferences

使用集合调用构造函数类并从 asyncTask 获取 sharedpreferences(无法传递上下文)

SharedPreferences的读写

安卓SharedPreferences的使用

SharedPreferences三种获取方式的不同