奇怪的异常:使用 get 布尔值时无法将字符串转换为布尔值

我得到一个非常奇怪的错误。我有2个活动。在这两个上,我都在使用(如果很重要)通过我正在调用的每个活动SharedPreferencesMODE_PRIVATEsp = 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);

如果它很重要,则引发异常的代码位于按钮的onClick


答案 1

如果曾经有一个字符串带有该键,即使偶然,它也会一直保留在那里,直到您清除该应用程序的数据或卸载为止。尝试卸载它,看看它是否仍然发生。


答案 2

在此 Android 方法中出现异常:

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