Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SharedReferences.getInt(“累积”,0)第22条陷阱-如何解决?_Android_Android Preferences - Fatal编程技术网

Android SharedReferences.getInt(“累积”,0)第22条陷阱-如何解决?

Android SharedReferences.getInt(“累积”,0)第22条陷阱-如何解决?,android,android-preferences,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();

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

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Editor editor = prefs.edit();
    editor.putInt("re-initiative-value", 0);
    editor.commit();
  }
存储在SharedReferences中的累积值给我带来了一个问题(我无法在每次程序启动时重新初始化它)

因此,每当我尝试
prefs.getInt(“累积值”,0)
,我都会得到一个运行时异常:

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());
PreferenceManager.setDefaultValues(this,R.xml.preferences,false);
prefs=PreferenceManager.getDefaultSharedPreferences(此);
Map allPrefs=prefs.getAll();
for(Map.Entry:allPrefs.entrySet())
Log.i(“allPrefs”,entry.getKey()+”/“+entry.getValue());
结果日志显示没有类型不匹配


伪装成
java.lang.ClassCastException

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

从您的异常情况来看,您似乎有字符串首选项的名称,而不是该首选项不存在:

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)
发件人:

返回首选项值,如果它 存在,或定义值。投掷 ClassCastException如果存在 此名称的首选项不是 整数

如果您更改了它的名称,它应该可以工作。

下面是我如何通过将以下代码放置在
onCreate()中来“解决”这个问题的:

试试看{

int dummy=prefs.getInt(“累积值”,0)+1;//我遇到了几乎相同的问题。当我为所有首选项分配键时,问题得到了解决。因此,请检查yor prefrerences.xml中是否有空键)

如果您有一个与您请求的类不同的现有pref,则会发生此问题


例如,如果您存储了一个字符串,但使用Prefs.getInt();这将引发一个错误。

谢谢++。可能是在我的应用程序开发过程中的某个地方,该首选项被定义为字符串,但问题是在我卸载应用程序后才开始的,然后重新安装。卸载应用程序时,应用程序的首选项是否也会被删除?@Tim感谢并+1确认了这一点。我更改了名称。它仍然抛出此异常。为什么?是的,我抛出了。prefs对象适用于除此之外的所有其他首选项。
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);
}