与其他值不同,我可以在每次应用程序启动时在 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)
避免此类异常的好策略是什么?
我想把对 getInt() 的调用放在 try-catch 子句中,这样我就可以在第一个程序启动时编写它,但后来我意识到:这不是 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
的不同问题。 最佳答案
从您的异常(exception)情况来看,您似乎确实为字符串首选项使用了此名称,而不是此首选项不存在:
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 :
如果您更改它的名称,它应该可以工作。
关于android - SharedPreferences.getInt ("cumulative", 0) catch 22 - 如何解决?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5984507/