奇怪的异常:使用getBoolean时无法将String转换为Boolean

时间:2012-10-12 03:04:10

标签: java android exception casting sharedpreferences

我收到一个非常奇怪的错误。 我有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);

onClick上这很好用。但是当我在主要活动中尝试时,我得到了这个

{{1}}

我确定我没有在同一个键的中间位置放置{{1}}

有什么想法吗?

谢谢!

编辑: 一些代码:

{{1}}

如果重要,抛出异常的代码位于按钮的{{1}}

7 个答案:

答案 0 :(得分:47)

如果有一个带有该密钥的字符串,即使是偶然的,它也会一直存在,直到您清除应用程序的数据或卸载为止。尝试卸载它以查看它是否仍然存在。

答案 1 :(得分:4)

此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

答案 2 :(得分:2)

我假设

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

所以你可以这样做

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

答案 3 :(得分:2)

使用以下代码在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);

答案 4 :(得分:1)

这条线     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;
}

试试这个肯定会有效。

答案 5 :(得分:1)

这是每个人用钥匙做的常见错误, 我猜IntroActivity.SHOW_INTRO =“xyz_key”如果,你使用相同的“xyz_key”换另一个常量会出现这个错误,所以key的值应该是唯一的..快乐编码:)

答案 6 :(得分:0)

错误地,我在XML文件android:key="your_key"中为相同 提供了两个首选项时出现此异常!

因此,仔细检查您的settings.xml可能有所帮助。