SharedPreferences.getInt(“cumulative”,0)catch 22 - 如何解决?

时间:2011-05-12 21:09:00

标签: android android-preferences

与其他值不同,我可以在每次应用启动时在onCreate()初始化:

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Editor editor = prefs.edit();
    editor.putInt("re-initiative-value", 0);
    editor.commit();
  }

存储在SharedPreferences中的累积值对我来说是个问题(每次程序启动时我都无法重新初始化它。)

因此,每当我尝试prefs.getInt("cumulative-valuee", 0)时,我都会遇到RuntimeException:

05-12 16:45:50.489: ERROR/AndroidRuntime(1767): FATAL EXCEPTION: main
05-12 16:45:50.489: ERROR/AndroidRuntime(1767): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1234, result=-1, data=Intent { (has extras) }} to activity {com.example.app/com.example.app.MyActivity}: java.lang.ClassCastException: java.lang.String
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at android.app.ActivityThread.access$2800(ActivityThread.java:125)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at android.os.Looper.loop(Looper.java:123)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at android.app.ActivityThread.main(ActivityThread.java:4627)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at java.lang.reflect.Method.invokeNative(Native Method)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at java.lang.reflect.Method.invoke(Method.java:521)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at dalvik.system.NativeStart.main(Native Method)
05-12 16:45:50.489: ERROR/AndroidRuntime(1767): Caused by: java.lang.ClassCastException: java.lang.String
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at android.app.ContextImpl$SharedPreferencesImpl.getInt(ContextImpl.java:2707)

避免此类异常的好策略是什么?

我正在考虑在try-catch子句中调用getInt(),这样我就可以在第一次程序启动时编写它,但后来我意识到:不是getInt()中的默认值(第二个参数)意味着这种情况呢?

更新:尝试验证@ MyBD的建议,我添加了以下代码,以便在首次运行时转储所有首选项名称和值:

PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
prefs = PreferenceManager.getDefaultSharedPreferences(this);

Map<String,?> allPrefs = prefs.getAll();
for (Map.Entry<String, ?> entry : allPrefs.entrySet())
  Log.i("allPrefs", entry.getKey() + "/" + entry.getValue());

生成的日志显示没有类型不匹配。

这必须是伪装成java.lang.ClassCastException的另一个问题。

5 个答案:

答案 0 :(得分:4)

从您的例外情况来看,您似乎确实为字符串首选项设置了此名称,而不是此首选项不存在:

05-12 16:45:50.489: ERROR/AndroidRuntime(1767): Caused by: java.lang.ClassCastException: java.lang.String
05-12 16:45:50.489: ERROR/AndroidRuntime(1767):     at android.app.ContextImpl$SharedPreferencesImpl.getInt(ContextImpl.java:2707)

来自documentation

  

如果是,则返回首选项值   存在或defValue。抛出   ClassCastException如果有的话   这个名字的偏好不是   一个int。

如果更改名称,则应该有效。

答案 1 :(得分:1)

通过将以下代码放在onCreate()

中,以下是我“解决”问题的方法
try {
  int dummy = prefs.getInt("cumulative-valuee", 0) + 1 ; // <== this generate exception -- why?
  Log.i("dummy ready", " ==> " + dummy);
}
catch (ClassCastException e) {
  Editor editor = prefs.edit();
  editor.putInt("cumulative-valuee", 0);  
  editor.commit();

  int dummy = prefs.getInt("cumulative-valuee", 0) + 1 ; // <== try again (should yield NO exception)
  Log.i("dummy ready", " ==> " + dummy);
}

有效。 :)

答案 2 :(得分:1)

发现这一点,只要你有一个不同于你请求的类的现有pref就会发生这种情况。

例如,如果你已经存储了一个String,但是使用了Prefs.getInt();这会引发错误。

答案 3 :(得分:0)

您是否正确设置了prefs对象?这不会出现在您提供的代码中。

答案 4 :(得分:0)

我遇到了几乎相同的问题。当我为所有偏好分配了密钥时,它就解决了。所以,检查yor prefrerences.xml是否为空键)