簡體   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