奇怪的例外:使用getBoolean时不能强制转换为布尔值

我得到一个非常奇怪的错误。 我有2个活动。 在这两个我得到的SharedPreferences使用MODE_PRIVATE (如果重要)通过sp = getPreferences(MODE_PRIVATE); 在每个活动的onCreate()我打电话sp.getBoolean(IntroActivity.SHOW_INTRO, true)

IntroActivity这工作正常。 但是当我在主要活动中尝试时,我正在得到这个

 10-12 04:55:23.208: E/AndroidRuntime(11668): FATAL EXCEPTION: main 10-12 04:55:23.208: E/AndroidRuntime(11668): java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean 10-12 04:55:23.208: E/AndroidRuntime(11668): at android.app.SharedPreferencesImpl.getBoolean(SharedPreferencesImpl.java:242) 10-12 04:55:23.208: E/AndroidRuntime(11668): at com.lablabla.parkme.ParkMeActivity$2.onClick(ParkMeActivity.java:194) 10-12 04:55:23.208: E/AndroidRuntime(11668): at android.view.View.performClick(View.java:4084) 10-12 04:55:23.208: E/AndroidRuntime(11668): at android.view.View$PerformClick.run(View.java:16966) 10-12 04:55:23.208: E/AndroidRuntime(11668): at android.os.Handler.handleCallback(Handler.java:615) 10-12 04:55:23.208: E/AndroidRuntime(11668): at android.os.Handler.dispatchMessage(Handler.java:92) 10-12 04:55:23.208: E/AndroidRuntime(11668): at android.os.Looper.loop(Looper.java:137) 10-12 04:55:23.208: E/AndroidRuntime(11668): at android.app.ActivityThread.main(ActivityThread.java:4745) 10-12 04:55:23.208: E/AndroidRuntime(11668): at java.lang.reflect.Method.invokeNative(Native Method) 10-12 04:55:23.208: E/AndroidRuntime(11668): at java.lang.reflect.Method.invoke(Method.java:511) 10-12 04:55:23.208: E/AndroidRuntime(11668): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 10-12 04:55:23.208: E/AndroidRuntime(11668): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 10-12 04:55:23.208: E/AndroidRuntime(11668): at dalvik.system.NativeStart.main(Native Method) 

我确信我没有在同一个关键字的中间放置一个String

有任何想法吗?

谢谢!

编辑:一些代码:

 //onCreate() sp = getPreferences(MODE_PRIVATE); // other method boolean showIntro = sp.getBoolean(IntroActivity.SHOW_INTRO, true); // Exception is here showIntroCheckBox.setChecked(showIntro); 

如果它很重要,抛出exception的代码是在一个button的onClick

Solutions Collecting From Web of "奇怪的例外:使用getBoolean时不能强制转换为布尔值"

如果曾经有过这个密钥的string,即使意外,它仍然会留在那里,直到您清除应用程序的数据或卸载。 尝试卸载它,看看它是否仍然存在。

此Android方法发生exception:

 public boolean getBoolean(String key, boolean defValue) { synchronized (this) { awaitLoadedLocked(); Boolean v = (Boolean)mMap.get(key); // On this line return v != null ? v : defValue; } } 

我唯一可以做出这个错误的是,你正在代码中的其他地方重用IntroActivity.SHOW_INTRO关键字。

我假设

 sp.getBoolean(IntroActivity.SHOW_INTRO, true)// this line returns a String value. 

所以你可以这样做

 boolean showIntro = Boolean.parseBoolean(sp.getBoolean(IntroActivity.SHOW_INTRO, true)); 

使用下面的代码在SharedPreference设置布尔值:

  SharedPreferences appSharedPrefs = PreferenceManager .getDefaultSharedPreferences(this.getApplicationContext()); Editor prefsEditor = appSharedPrefs.edit(); prefsEditor.putBoolean(IntroActivity.SHOW_INTRO, true); prefsEditor.commit(); 

并从SharedPreference检索布尔值使用此代码:

 SharedPreferences appSharedPrefs = PreferenceManager .getDefaultSharedPreferences(this.getApplicationContext()); boolean showIntro = appSharedPrefs.getBoolean(IntroActivity.SHOW_INTRO, true); 

该行sp.getBoolean(IntroActivity.SHOW_INTRO,true)//此行返回一个string值。

所以你必须做如下给出,

 String flag=sp.getBoolean(IntroActivity.SHOW_INTRO, true); if(flag.equalsIgnoreCase("true")){ boolean showIntro = true; }else{ boolean showIntro = false; } 

尝试这一点肯定会奏效。

这是每个人都会犯的错误,我猜IntroActivity.SHOW_INTRO =“xyz_key”if,你用另外一个“xyz_key”作为常量,这个错误会发生,所以key的值应该是唯一的。 🙂

得到这个exception时,我错误地给了两个首选项在XML文件android:key="your_key"同一个

所以仔细检查你的settings.xml可能会有所帮助。