RxJava2与Kotlin:OnErrorNotImplementedException错误处理求助
解决RxJava2 + Kotlin中的
NotImplementedError与错误处理问题 首先,我们来拆解你遇到的两个错误:
- 第一个
OnErrorNotImplementedException:这是RxJava的默认行为——当Observable发射了错误事件,但订阅者没有提供onError回调时,RxJava会抛出这个异常来提醒你错误未被处理。你添加onError回调后,这个问题就解决了,现在你看到的是真正的根源错误:kotlin.NotImplementedError。 - 第二个
NotImplementedError:这是Kotlin的专属错误,通常意味着你代码中有TODO()函数调用,或者某个抽象方法/接口方法没有被实现。
第一步:定位错误根源
你当前的onError只打印了错误的字符串描述,看不到具体的调用堆栈,这很难找到问题所在。先修改你的onError回调,打印完整的错误堆栈:
onError = { Log.e("TEST", "加载酒吧数据失败", it) // 第三个参数传入Throwable,会打印完整堆栈 getView()?.hideProgress() // 别忘了隐藏进度条,避免UI卡住 getView()?.showError("加载数据失败,请稍后重试") // 给用户友好提示 }
运行后查看Logcat,堆栈信息会明确指出是哪个类的哪个方法没有实现——大概率是你的BarMapper.map()方法,因为这是你自己写的转换逻辑。
第二步:修复未实现的代码
如果堆栈指向BarMapper.map(),检查这个方法的实现:
你可能写了类似这样的代码:
object BarMapper { fun map(parseObjects: List<ParseObject>): List<Bar> { TODO("not implemented") // 这行代码会直接抛出NotImplementedError } }
把这个TODO替换成实际的转换逻辑,比如遍历ParseObject列表,转换成你的Bar实体类:
object BarMapper { fun map(parseObjects: List<ParseObject>): List<Bar> { return parseObjects.map { parseObj -> Bar( id = parseObj.objectId, name = parseObj.getString("name"), // 其他字段根据你的ParseObject结构补充 ) } } }
如果错误不是来自BarMapper,就根据堆栈提示找到对应的未实现方法,补全它的逻辑即可。
第三步:完善RxJava错误处理的最佳实践
为了避免后续再遇到类似问题,建议遵循这些规则:
- 永远不要忽略
onError:RxJava中未处理的错误会直接导致崩溃,所以每个订阅都必须提供onError回调。 - 在数据流中提前处理错误:可以使用
onErrorReturn、onErrorResumeNext等操作符,在数据到达订阅者之前就处理错误,比如返回默认值或者切换到备用数据流:interactor?.getBar() ?.onErrorReturn { emptyList() } // 错误时返回空列表 ?.compose(schedulerProvider.ioToMainObservableScheduler()) ?.subscribeBy(...) - 统一错误处理:可以创建一个全局的错误处理Transformer,把重复的错误处理逻辑抽离出来,避免每个订阅都写一遍。
内容的提问来源于stack exchange,提问作者Romain Caron
相关产品推荐
相关产品推荐

