sharedPref.getInt:java.lang.String无法强制转换为java.lang.Integer

时间:2016-01-26 19:33:42

标签: java android

我有preferences.xml,其中包含以下定义:

<ListPreference
    android:title="@string/LimitSetting"
    android:summary="@string/LimitSettingText"
    android:key="limitSetting"
    android:defaultValue="10"
    android:entries="@array/limitArray"
    android:entryValues="@array/limitValues" />

并且值定义如下:

<string-array name="limitArray">
    <item>1 %</item>
    <item>3 %</item>
    <item>5 %</item>
    <item>10 %</item>
    <item>20 %</item>
</string-array>
<string-array name="limitValues">
    <item>1</item>
    <item>3</item>
    <item>5</item>
    <item>10</item>
    <item>20</item>
</string-array>

在活动中被调用如下:

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
int offsetProgressInitial = sharedPref.getInt("limitSetting", 10);

到目前为止一直很好,但是当代码实际调用时我得到了这个错误:

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at android.app.SharedPreferencesImpl.getInt(SharedPreferencesImpl.java:239)
at com.test.app.NewEntryActivity.onCreate(NewEntryActivity.java:144)
at android.app.Activity.performCreate(Activity.java:5977)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365) 
at android.app.ActivityThread.access$800(ActivityThread.java:148) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) 

这个错误对我没有任何意义。该列表仅包含可以转换为int的值,xml文件和代码中给出的默认值也只表示一个数字。那么为什么我会得到这个错误,以及如何解决它?

3 个答案:

答案 0 :(得分:4)

如果你看一下getInt()在内部的作用,你会看到问题:

Integer v = (Integer)mMap.get(key);

您的密钥“limitSetting”返回String,无法转换为整数。

你可以自己解析它:

int offsetProgressInitial = Integer.parseInt(sharedPref.getString("limitSetting", "10"));

答案 1 :(得分:1)

首先让我们看一下SharedPreferences.getInt()方法。

public abstract int getInt(String key,int defValue)

  • 在API级别1中添加
  • 从首选项中检索int值。

<强>参数

  1. :要检索的首选项的名称。
  2. defValue :要返回的值     如果此偏好不存在。
  3. 返回:返回首选项值(如果存在)或defValue。 引发 ClassCastException 如果此名称的偏好不是int。

    因此,在您的情况下,所有条目值都已定义为字符串数组。因此会抛出类强制转换异常。

    您可以通过修改代码来解决此问题,如下所示。

    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    int offsetProgressInitial = Integer.parseInt(sharedPref.getString("limitSetting", "10"));
    

答案 2 :(得分:0)

问题在于,如果从未调用过putInt,那么即使您设置了默认的整数值,getInt也会返回空值。

这似乎是一个从未修复的错误。因此解决方案是先调用putInt,再调用getInt