获得 ClassCastException: java.lang.Integer cannot be cast to java.lang.String error without cast
Posted
技术标签:
【中文标题】获得 ClassCastException: java.lang.Integer cannot be cast to java.lang.String error without cast【英文标题】:Getting a ClassCastException: java.lang.Integer cannot be cast to java.lang.String error without casting 【发布时间】:2018-09-29 23:39:49 【问题描述】:我正在开发适用于 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 比较陌生。
解决方案
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);
【问题讨论】:
String tmp = prefs.getInt("capitalownership", "0")+"" String tmp = prefs.getString("capitalownership", "0")-->这必须是整数。 显示 SharedPreferencesImpl.java 类中第 235 行的代码 将“资本所有权”更改为您声明的字符串 【参考方案1】:您第一次保存capitalownership
时可能没有将其保存为字符串,因此当您尝试检索它时,它会检索一个整数,但您尝试转换为字符串getString
它会得到异常。
String tmp = prefs.getString("capitalownership", "0");
试试这样:
int tmp = prefs.getInt("capitalownership", 0);
此外,您已经将编辑文本设置为仅输入数字,因此您不会在此处获得字符串。
编辑:
共享首选项存储为Map<String, Object>
。如您所见,映射的值是一般的Object
,如果您保存为Integer
,则需要以整数形式检索。这是非常动态的,因此如果您将一次保存为integer
,而下一次保存为String
(使用相同的键),您需要跟踪您保存的类型以便检索它。
如果您曾经保存为Integer
,然后再次保存(在同一密钥中)为String
,则在检索它时,您需要使用getString()
。如果您不确定其中有什么,您可以使用 getAll() 方法以Map<String, Object>
的形式检索整个首选项,然后您可以在此映射中使用get("capitalownership")
,最后使用instanceof
查看它的类型是。但这太麻烦了,您只需要确定您将以某种类型保存该密钥(资本所有权)并确保您始终这样做。
所以这就是正在发生的事情:
1)您尝试检索与该键关联的值,Android 会为您提供一个对象,
2) Android 然后尝试转换为与该方法关联的值(在您的情况下为 String)。因为值实际上是一个整数,这就是类转换问题的来源。
【讨论】:
但是当我使用它时,是否可以清除那个旧值?我不熟悉 sharedPreferences 如何存储以及如何检索它。我想当我简单地从设备中删除应用程序并重新安装它时,应该没问题。 非常感谢!我将更改我的代码:) 是的,但问题是,我猜共享首选项是基于字符串的。我不得不将所有整数更改为字符串。每当我使用编辑器时,我认为都会发生转换......我在第一篇文章中就有了解决方案。【参考方案2】:https://developer.android.com/reference/android/content/SharedPreferences.html#getString(java.lang.String,%20java.lang.String):
如果存在,则返回首选项值或 defValue。投掷 ClassCastException 如果此名称的首选项不是 一个字符串。
所以我猜你有一个已存储为整数的“资本所有权”偏好
【讨论】:
是的,一定是对的,是否可以清除该偏好?还是那个条目? ***.com/questions/3687315/deleting-shared-preferences ?【参考方案3】:你不应该使用
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);
【讨论】:
以上是关于获得 ClassCastException: java.lang.Integer cannot be cast to java.lang.String error without cast的主要内容,如果未能解决你的问题,请参考以下文章
MyEcplise导入项目报错:Errors running builder 'JavaScript Validator' on project '项目名'. ja
PySpark:java.lang.ClassCastException