繁体   English   中英

获取ClassCastException:java.lang.Integer无法强制转换为java.lang.String错误

[英]Getting a ClassCastException: java.lang.Integer cannot be cast to java.lang.String error without casting

我正在开发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

编辑解决方案:

    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);
    }
}

你第一次节省了capitalownership你可能没有把它保存为String,所以当你试图检索它时,它会检索一个Integer,但是当你执行getString时你会尝试capitalownership为String,它会得到异常。

String tmp = prefs.getString("capitalownership", "0");

试试这样:

int tmp = prefs.getInt("capitalownership", 0);

此外,您已经将编辑文本设置为仅输入数字,因此您不会在此处获得字符串。

编辑:

共享首选项存储为Map<String, Object> 正如您所看到的,map的值是一般的Object ,如果您保存为Integer ,则需要检索整数。 这是非常动态的,所以如果你把一次保存为一个integer而下一次保存为一个String (对于同一个键),你需要跟踪你保存的类型,以便你可以检索它。

如果您将一次保存为Integer并稍后再次保存(在同一个键中)作为String ,则在检索它时,您需要使用getString() 如果您不确定那里有什么,您可以使用getAll()方法将整个首选项检索为Map<String, Object> ,然后您可以在此地图中使用get("capitalownership") ,最后使用instanceof检查看看它是什么类型。 但这太麻烦了,你只需要确定你将某种类型的密钥(资本所有权)保存起来,并确保你总能做到这一点。

所以这就是发生的事情:

1)您尝试检索与该键关联的值,Android会为您提供一个对象,

2)Android然后尝试强制转换为与方法关联的值(在您的情况下为String)。 因为该值实际上是一个Integer,它就是类转换问题的来源。

https://developer.android.com/reference/android/content/SharedPreferences.html#getString(java.lang.String,%20java.lang.String)

返回首选项值(如果存在)或defValue。 如果存在此名称不是String的首选项,则抛出ClassCastException。

所以我猜你有一个“资本所有权”偏好,它已被存储为整数

你不应该使用

    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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM