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
相关产品推荐
相关产品推荐

