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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:07:34