【问题标题】:Public shared preferences causes app to crash公共共享首选项导致应用程序崩溃
【发布时间】:2016-01-23 23:12:29
【问题描述】:

我需要有一个可以通过我的班级中的多个方法访问的共享首选项。为此,我将共享首选项设为公开,如下所示:

public SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

然后我可以通过两种不同的方法访问它:

SharedPreferences.Editor editor=myPreference.edit();

当我这样做时,应用程序崩溃了,这是 logcat:

01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 致命例外: main 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 流程:com.example.griffin.dinnerplannerapp,PID:20873 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: java.lang.RuntimeException: 无法实例化 活动 组件信息{com.example.griffin.dinnerplannerapp/com.example.griffin.dinnerplannerapp.sundayActivity}: java.lang.NullPointerException:尝试调用虚拟方法 'android.content.Context android.content.Context.getApplicationContext()' 在一个空对象上 参考 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime:
在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2282) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2439) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.access$800(ActivityThread.java:162) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1348) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.os.Handler.dispatchMessage(Handler.java:102) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 在 android.os.Looper.loop(Looper.java:135) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.main(ActivityThread.java:5421) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 在 java.lang.reflect.Method.invoke(Native 方法) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime:
在 java.lang.reflect.Method.invoke(Method.java:372) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime:
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime:引起:java.lang.NullPointerException:尝试 调用虚拟方法'android.content.Context android.content.Context.getApplicationContext()' 在一个空对象上 参考 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime:
在 android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:106) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 com.example.griffin.dinnerplannerapp.sundayActivity.(sundayActivity.java:61) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 java.lang.reflect.Constructor.newInstance(Native Method) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime:在 java.lang.Class.newInstance(Class.java:1606) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.Instrumentation.newActivity(Instrumentation.java:1066) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2272) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2439) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.access$800(ActivityThread.java:162) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1348) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.os.Handler.dispatchMessage(Handler.java:102) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime:在 android.os.Looper.loop(Looper.java:135) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.main(ActivityThread.java:5421) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 在 java.lang.reflect.Method.invoke(Native 方法) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime:
在 java.lang.reflect.Method.invoke(Method.java:372) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)

 

任何帮助将不胜感激提前感谢。

【问题讨论】:

标签: java android sharedpreferences


【解决方案1】:

您不能在调用 onCreate() 方法之前调用 getApplicationContext(),这可能是它返回 null 并给您此错误的原因。

因此,我建议您在onCreate() 中设置该字段,或者在需要使用SharedPreferences 的任何地方直接使用PreferenceManager.getDefaultSharedPreferences(getApplicationContext())

【讨论】:

    【解决方案2】:

    您是否在 Manifest 中声明了访问外部存储的权限?

        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    编辑 1: 在 LogCat 中搜索了一个 Detail 发现这个

    java.lang.NullPointerException: 尝试调用虚拟方法'android.content.Context android.content.Context.getApplicationContext()

    看看这里Get application context returns null也许这会有所帮助。

    编辑 2: 我添加了链接的主要部分:

    您应该在onCreate() 中创建一个静态上下文实例,并确保您声明了AndroidManifest.xml

    上下文实例的代码:

    public class MyApp extends Application {
    

    //私有静态MyApp实例; 私有静态上下文 mContext;

    public static MyApp getInstance() {
        return instance;
    }
    
    public static Context getContext() {
      //  return instance.getApplicationContext();
      return mContext;
    }
    
    @Override
    public void onCreate() {
        super.onCreate();
    //  instance = this;
     mContext = getApplicationContext();    
    }
    

    }

    还有清单:

    <application android:name="com.mypackage.MyApp"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </application>

    【讨论】:

    • 如果声誉低,我无法发表评论,很抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多