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

Android Preferences DataStore读取报IOException无伴生对象错误

问题根因

这个报错是Kotlin语法使用错误导致的:

  • Kotlin中in关键字的作用是判断某个值是否存在于区间、集合这类实现了contains方法的对象中,你写的exception in IOException相当于把IOException这个类本身当成了可遍历/支持包含判断的对象来使用,但IOException是普通的异常类,没有实现对应逻辑的伴生对象,编译器无法执行这个判断,就会抛出你看到的错误。
  • 旧项目能正常运行,大概率是之前的代码用对了类型判断关键字,后续迁移或者修改代码时误把is写成了in,和DataStore本身的实现没有关系。
修复方案

把异常类型判断的关键字从in替换为Kotlin专门用来做类型匹配的is即可,修正后的代码段如下:

private const val DATA_STORE_NAME = "SETTINGS_STATE_OF_APP"
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = DATA_STORE_NAME)
class PreferencesDatastore(private val context: Context) {

    val readData: Flow<Model> = context.dataStore.data
        .catch { exception ->
            // 替换in为is做类型判断
            if (exception is IOException){
                emit(emptyPreferences())
            }else {
                throw exception
            }
        }
        .map {
            // 你的业务映射逻辑
        }
}
  • 补充:如果项目使用的协程版本支持,你也可以直接给catch操作符指定捕获的异常类型,省略内部的判断逻辑,不过上面的写法兼容所有协程版本,和官方实现逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:39:41