Получение ClassCastException: java.яз..Целое число не может быть приведено к java.яз..Ошибка строки без приведения
Я работаю над приложением для Android и не могу понять, какую ошибку я совершаю. Я ищу ошибку более 4 часов, поэтому, пожалуйста, не думайте, что я беспокою вас из-за лени отладки.
Я получаю следующее исключение, работая с SharedPreferences:
E/AndroidRuntime: FATAL EXCEPTION: main
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:235)
at de.immozukunft.quicksteuer.QuickSteuerActivity.updateTextView(QuickSteuerActivity.java:56)
at de.immozukunft.quicksteuer.QuickSteuerActivity.onCreate(QuickSteuerActivity.java:36)
Но я не делаю бросок в этой линии в соответствии с моим пониманием. Строка 36 является вызовом методаupdateTextView () .
private void updateTextView() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
int legalForm = Integer.parseInt(prefs.getString("legal_form", "1"));
boolean industrialTax = prefs.getBoolean("industrial_tax", false);
boolean turnoverTax = prefs.getBoolean("turnover_tax", false);
boolean disbursal = prefs.getBoolean("disbursal", false);
String tmp = prefs.getString("capitalownership", "0"); //this is line 56
int capitalOwnership = Integer.parseInt(tmp);
int estIncome = Integer.parseInt(prefs.getString("est_income", "0"));
}
Мое предпочтение в XML-файл выглядит следующим образом:
<EditTextPreference
android:defaultValue="0"
android:dialogTitle="@string/capitalownership"
android:inputType="number"
android:key="capitalownership"
android:title="@string/capitalownership" />
Мне нужно, чтобы я опубликовал полный код и полный список ошибок.
Я относительно новичок в Android, поэтому, пожалуйста, простите меня, если это глупый вопрос...
С уважением
THE-E
EDIT
Решение:
private void updateTextView() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String legalForm = prefs.getString("legal_form", "1");
boolean industrialTax = prefs.getBoolean("industrial_tax", false);
boolean turnoverTax = prefs.getBoolean("turnover_tax", false);
boolean disbursal = prefs.getBoolean("disbursal", false);
String capitalOwnership = prefs.getString("capitalownership", "0");
String estIncome = prefs.getString("est_income", "1");
settingstv.setText(getString(R.string.overview_settings,
legalForm,
Boolean.toString(industrialTax),
Boolean.toString(turnoverTax),
Boolean.toString(disbursal),
capitalOwnership,
estIncome));
try {
if (!compareCurrentWithStoredVersionCode(this, prefs, "storedVersionCode")) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("legal_form", legalForm);
editor.putBoolean("industrial_tax", industrialTax);
editor.putBoolean("turnover_tax", turnoverTax);
editor.putBoolean("disbursal", disbursal);
editor.putString("capitalownership", capitalOwnership);
editor.putString("est_income", estIncome);
editor.commit();
}
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "updateTextView()", e);
}
}
3 ответов:
В первый раз, когда вы сохранили
capitalownership, вы, вероятно, не сохранили его как строку, поэтому при попытке получить его, он получит целое число, но вы пытаетесь привести к строке, когда вы делаетеgetString, и он получит исключение.String tmp = prefs.getString("capitalownership", "0");Попробуйте так:
int tmp = prefs.getInt("capitalownership", 0);Кроме того, вы уже настроили текст редактирования на ввод только чисел, поэтому здесь вы не получите строку.
Редактировать:
Общие предпочтения хранятся в видеMap<String, Object>. Как видите значение карты является общимObject, Если вы сохранили какInteger, вам нужно будет получить как целое число. Ths довольно динамичен, поэтому, если вы сохранили один раз какinteger, а в следующий раз какString(к тому же ключу), вам нужно отслеживать сохраненный тип, чтобы вы могли его восстановить.Если вы сохранили один раз как
Integerи позже сохраните снова (в том же ключе) какString, то при его извлечении вам нужно будет использоватьgetString(). Если вы не уверены, что там находится, Вы можете использовать метод getAll() для извлечения всего предпочтения какMap<String, Object>, то вы можете использоватьget("capitalownership")в этой карте и, наконец, проверить сinstanceof, чтобы увидеть, какой это тип. Но это слишком громоздко, вам нужно только установить, что вы сохраните этот ключ(capitalownership) с определенным типом и убедитесь, что вы всегда это делаете.Так вот что происходит:
1) вы пытаетесь получить значение, связанное с этим ключом, и Android выдает вам объект,
2) затем Android пытается привести к значению, связанному с методом (строка в вашем случае). Поскольку значение на самом деле является целым числом, именно отсюда возникает проблема приведения класса.
Возвращает значение предпочтения, если оно существует, или defValue. Бросает ClassCastException, если есть предпочтение с этим именем, которое не является строка.
Итак, я предполагаю, что у вас есть предпочтение "capitalownership", которое было сохранено в виде целого числа
Вы не должны использовать
int capitalOwnership = Integer.parseInt(tmp);Потому что вы пытаетесь получить целое число в виде строки
<EditTextPreference android:defaultValue="0" android:dialogTitle="@string/capitalownership" **android:inputType="number"** android:key="capitalownership" android:title="@string/capitalownership" />Вместо этого используйте этот
int capitalOwnership = pref.getInt("capitalownership", 0);Также вам нужно сохранить его вот так
pref.putInt("key",value);
Comments