【问题标题】:Weird exception: Cannot cast String to Boolean when using getBoolean奇怪的异常:使用 getBoolean 时无法将 String 转换为 Boolean
【发布时间】:2012-10-12 03:04:10
【问题描述】:

我遇到了一个非常奇怪的错误。 我有 2 个活动。在两者上,我都在每个活动的onCreate() 上使用MODE_PRIVATE(如果重要的话)通过sp = getPreferences(MODE_PRIVATE); 获得SharedPreferences 我打电话给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

【问题讨论】:

  • 你能把代码贴出来让程序员帮你吗? :)
  • 你需要什么代码?我写了与 SharedPrefernces 相关的所有内容..
  • 添加了一些。虽然没有太多展示..

标签: java android exception casting sharedpreferences


【解决方案1】:

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

【讨论】:

  • 嗯,它工作..奇怪的是它在一个活动上工作,在另一个活动中它抛出异常,但在卸载并重新安装后它工作......谢谢!
  • clear() 之后是commit() 还是apply()?此外,偏好对于每个活动都是个体的。如果您想真正共享​​>它们,请使用单个活动创建它们,而不是两者。
  • 我做到了,但只在一项活动中。现在我以@Nishant 所说的相同方式获取 SharedPreferences 并分享它们。我没有意识到我这样做的方式,我没有分享,只清除了一次。这就是为什么一个工作,一个没有。谢谢!
【解决方案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 作为字符串。

【讨论】:

    【解决方案3】:

    我假设

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

    所以你可以这样做

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

    【讨论】:

    • 试过了,编译错误The method parseBoolean(String) in the type Boolean is not applicable for the arguments (boolean) 因为第一行返回一个布尔值
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      线 sp.getBoolean(IntroActivity.SHOW_INTRO, true)// 此行返回一个字符串值。

      所以你必须按照下面给出的做,

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

      试试这个肯定会成功的。

      【讨论】:

      • 错了。这将在另一台设备上崩溃。
      【解决方案6】:

      这是每个人在使用密钥时都会犯的常见错误, 我猜 IntroActivity.SHOW_INTRO="xyz_key" 如果,您对另一个常量使用相同的“xyz_key”,则会发生此错误,因此键的值应该是唯一的.. 快乐编码:)

      【讨论】:

        【解决方案7】:

        当我错误地将 XML 文件 android:key="your_key" 中的 same key 指定给两个首选项时出现此异常!

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-10
          • 1970-01-01
          • 2012-07-07
          • 1970-01-01
          • 1970-01-01
          • 2016-01-12
          • 2011-03-12
          • 1970-01-01
          相关资源
          最近更新 更多