【问题标题】:NullPointerException at PreferenceManager.getDefaultSharedPreferences on startup启动时 PreferenceManager.getDefaultSharedPreferences 出现 NullPointerException
【发布时间】:2013-01-03 23:35:53
【问题描述】:

所以几个月前我正在重新制作我的应用程序(排除故障,并让一些事情变得更好)但现在我遇到了一个我没有找到并且不知道它的问题是。如果我在手机上运行该应用程序,则会出现此错误

01-20 22:37:46.595: E/AndroidRuntime(7350): FATAL EXCEPTION: main
01-20 22:37:46.595: E/AndroidRuntime(7350): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.stevedc.thinklogic/com.stevedc.thinklogic.TowerHanoi}: java.lang.NullPointerException
01-20 22:37:46.595: E/AndroidRuntime(7350):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1891)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at android.os.Looper.loop(Looper.java:137)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at android.app.ActivityThread.main(ActivityThread.java:4441)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at java.lang.reflect.Method.invokeNative(Native Method)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at java.lang.reflect.Method.invoke(Method.java:511)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at dalvik.system.NativeStart.main(Native Method)
01-20 22:37:46.595: E/AndroidRuntime(7350): Caused by: java.lang.NullPointerException
01-20 22:37:46.595: E/AndroidRuntime(7350):     at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:371)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:366)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at com.stevedc.thinklogic.TowerHanoi.<init>(TowerHanoi.java:42)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at java.lang.Class.newInstanceImpl(Native Method)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at java.lang.Class.newInstance(Class.java:1319)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
01-20 22:37:46.595: E/AndroidRuntime(7350):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1882)

有人可以指出我需要查看故障所在的方向吗?

【问题讨论】:

  • 我把原因隔离出来放在标题里;注意初始异常从哪里传播。 (您的代码调用 PreferenceManager 然后抛出异常;考虑创建一个再现行为并发布该代码的minimal 测试用例:另外,考虑将代码移至@987654322 @; 我不确定构造函数 () 是否可以访问 SharedPreferences ..)

标签: android nullpointerexception sharedpreferences


【解决方案1】:

从logcat看来你调用的方法是

 PreferenceManager.getDefaultSharedPreferences(context); 

如果这里的上下文为空,那么就有可能出现这种异常。所以尝试传递一个有效的上下文作为参数。您可以使用以下方法。

Context context = getApplicationContext();

【讨论】:

  • 这有点老了,但是@StinePike 使用 activityContext 和 applicationContext 有什么区别?
  • @JohnShelley .. 它们都是 Context 的实例,但应用程序实例与应用程序的生命周期相关联,而 Activity 实例与 Activity 的生命周期相关联。因此,他们可以访问有关应用程序环境的不同信息...请参阅此答案 ..stackoverflow.com/a/4128799/931982
  • 那么使用 SharedPreferences 应用程序总是可以的吗?我会这样认为,因为它们在应用程序中被广泛使用,对吗? @StinePike
  • 我主要在可能的情况下使用Activity上下文..这个答案实际上是说明上下文的初始化,而不是区分活动和应用程序上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多