获得 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&lt;String, Object&gt;。如您所见,映射的值是一般的Object,如果您保存为Integer,则需要以整数形式检索。这是非常动态的,因此如果您将一次保存为integer,而下一次保存为String(使用相同的键),您需要跟踪您保存的类型以便检索它。

如果您曾经保存为Integer,然后再次保存(在同一密钥中)为String,则在检索它时,您需要使用getString()。如果您不确定其中有什么,您可以使用 getAll() 方法以Map&lt;String, Object&gt; 的形式检索整个首选项,然后您可以在此映射中使用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

ProGuard:ClassCastException

ClassCastException:字符串不能转换为

PySpark:java.lang.ClassCastException

应用 PathProperties 后的 ClassCastException

MIUI 11/12 主题切换导致 LifeCycleException、ClassCastException