java.lang.ClassCastException:java.lang.String无法强制转换为java.lang.Boolean

时间:2016-04-20 08:35:09

标签: android android-5.0-lollipop classcastexception android-6.0-marshmallow

我试图通过Sharedpreferences获取并设置一个布尔值。以下代码完全适用于Marshmallow但不适用于Lolipop(5.0.1) - 我得到一个异常:java.lang.ClassCastException:当我调用getintroStatus()时,java.lang.String不能强制转换为java.lang.Boolean

任何帮助?

public void setIntrodone(boolean status) {
        editor = settings.edit();
        editor.putBoolean("intro_done_boolean", status);
        editor.commit();
    }

    public boolean getintroStatus() {
        try {
            return settings.getBoolean("intro_done_boolean", false);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }

Logcat错误:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at android.app.SharedPreferencesImpl.getBoolean(SharedPreferencesImpl.java:263)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at io.authme.home.MitroApplication.getintroStatus(MitroApplication.java:107)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at io.authme.home.MainActivity.onCreate(MainActivity.java:81)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at android.app.Activity.performCreate(Activity.java:6285)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2405)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at android.app.ActivityThread.access$900(ActivityThread.java:154)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at android.os.Looper.loop(Looper.java:148)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5490)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
04-20 14:06:59.438 1401-1401/io.authme.home W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

2 个答案:

答案 0 :(得分:2)

在我看来,它与android版本没有任何关系,也许其他设备偏好使用相同的键设置为某些字符串,这会导致问题。

我建议您确保不要在其他地方使用相同的密钥,如果您确定不这样做,则建议您在其他设备上清除您的应用数据,然后重试。

答案 1 :(得分:1)

SharedPreferences.getBoolean文档中看到了这一点:

  

返回首选项值(如果存在)或defValue。如果存在此名称不是布尔值的首选项,则抛出ClassCastException。

也许你之前使用过这个键来存储一个不是布尔值的值?这可能看起来很明显,但您是否尝试在再次运行之前手动卸载应用程序?

另外,你的minSDK是什么(在你的build.gradle中)?您可能希望将其降低到21(see API Levels here),如果不是这样的话。您可能正在使用项目中与您的偏好相关的其他内容,Android 5.0无法运行。