SharedPreferences.getInt ("cumulative", 0) catch 22 - как решить? - PullRequest
3 голосов
/ 13 мая 2011

В отличие от других значений, которые я могу инициализировать в 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 () (2-й параметр), предназначенный именно для такого случая?

ОБНОВЛЕНИЕ: пытаясь проверить предложение @ 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 ]

4 голосов
/ 13 мая 2011

Из вашего исключения кажется, что у вас есть это имя для предпочтения строки, а не для того, чтобы этого предпочтения не существовало:

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)

Из документации :

Возвращает значение предпочтения, если оно существует, или defValue.Выдает ClassCastException, если есть предпочтение с этим именем, которое не является целым.

Если вы измените его имя, оно должно работать.

1 голос
/ 20 декабря 2012

Обнаружено, что это происходит всякий раз, когда у вас есть существующий преф, отличающийся от того, который вы запрашиваете.

Например, если вы сохранили строку, но используете Prefs.getInt ();это выдаст ошибку.

1 голос
/ 13 мая 2011

Вот как я «решил» проблему, поместив следующий код в 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);
}

Это работает. :)

0 голосов
/ 16 декабря 2011

У меня была почти такая же проблема. Это было решено, когда я назначил ключи для всех предпочтений. Итак, проверьте ваш prefreferences.xml на наличие пустых ключей)

0 голосов
/ 13 мая 2011

Правильно ли вы настроили объект prefs?Это не отображается в указанном вами коде.

...