You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AndroidX偏好设置中为何出现String转Integer的类型转换异常?

ListPreference引发ClassCastException的原因分析

场景还原

preferences.xml中的ListPreference配置

<ListPreference
    app:dependency="@string/auto_record_key"
    app:defaultValue="3"
    app:dialogTitle="@string/track_step_distance_dialog_title"
    app:entries="@array/track_step_distance_entries"
    app:entryValues="@array/track_step_distance_values"
    app:key="@string/track_step_distance_key"
    app:summary="@string/track_step_distance_summary"
    app:title="@string/track_step_distance_title" />

对应的数组配置

<string-array name="track_step_distance_entries">
    <item>off (time only)</item>
    <item>5</item>
    <item>10</item>
    <item>15</item>
    <item>20</item>
    <item>30</item>
    <item>50</item>
    <item>100</item>
    <item>200</item>
    <item>300</item>
</string-array>

<string-array name="track_step_distance_values">
    <item>0</item>
    <item>5</item>
    <item>10</item>
    <item>15</item>
    <item>20</item>
    <item>30</item>
    <item>50</item>
    <item>100</item>
    <item>200</item>
    <item>300</item>
</string-array>

触发异常的代码(onSharedPreferenceChanged方法内)

keyString = mContext.getString(R.string.track_step_distance_key );
if (  key == null || key.equals( keyString )  ) {
    int trackStepDistance = preferences.getInt( keyString, 3 ); 
}

抛出的异常信息

java.lang.RuntimeException: Unable to start activity ComponentInfo{dkr.ajijic.apps.tracks/dkr.ajijic.apps.tracks.MySettingsActivity}: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

异常原因

  1. ListPreference的存储特性:ListPreference继承自DialogPreference,无论entryValues中的内容是数字还是文本,它都会将选中值以字符串类型存入SharedPreferences,不会自动转换为整数或其他类型。
  2. 读取方法类型不匹配:代码中调用preferences.getInt()尝试读取实际为String类型的值,SharedPreferences会严格按照存储时的类型返回数据,不支持跨类型强制转换,因此直接触发ClassCastException。
  3. 默认值类型不一致:配置中defaultValue="3"会被当作字符串存入SharedPreferences,而代码里getInt()的默认值是整数3,类型不匹配进一步加剧了读取时的冲突。

快速修复方案

改用getString()读取值后手动转换为整数:

keyString = mContext.getString(R.string.track_step_distance_key );
if (key == null || key.equals(keyString)) {
    String valueStr = preferences.getString(keyString, "3");
    int trackStepDistance = Integer.parseInt(valueStr);
}

内容的提问来源于stack exchange,提问作者BinCodinLong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:20:32