公司的android客户端项目里集成了rxjava2和retrofit相关的开源库,然而最近发现友盟统计里这个错误数量异常多,调查后发现相关原因:没有订阅错误回调方法导致的。
问题复现:
Observable.create<String> {
// 向下发送事件
it.onNext("ddd")
}.flatMap { data ->
// 通过flatMap转换其中的Observable
Observable.create<Int> {
// 将string转成int,那么此处必然会报错NumberFormatException
it.onNext(data.toInt())
it.onComplete()
}
}.subscribe{
println(it)
}
此时运行代码会报错,错误如下:
io.reactivex.exceptions.OnErrorNotImplementedException: For input string: "ddd"
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)
at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.checkTerminate(ObservableFlatMap.java:495)
at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drainLoop(ObservableFlatMap.java:331)
at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drain(ObservableFlatMap.java:323)
at io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onError(ObservableFlatMap.java:571)
at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.tryOnError(ObservableCreate.java:85)
at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError(ObservableCreate.java:73)
at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:43)
at io.reactivex.Observable.subscribe(Observable.java:11194)
at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)
at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)
at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onNext(ObservableCreate.java:67)
at SimpleTestClsKt$main$1.subscribe(SimpleTestCls.kt:11)
at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
at io.reactivex.Observable.subscribe(Observable.java:11194)
at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55)
at io.reactivex.Observable.subscribe(Observable.java:11194)
at io.reactivex.Observable.subscribe(Observable.java:11180)
at io.reactivex.Observable.subscribe(Observable.java:11083)
at SimpleTestClsKt.main(SimpleTestCls.kt:22)
at SimpleTestClsKt.main(SimpleTestCls.kt)
而如果收集了onError方法则不会导致错误,正确代码如下:
Observable.create<String> {
it.onNext("ddd")
}.flatMap { data ->
Observable.create<Int> {
it.onNext(data.toInt())
it.onComplete()
}
}.subscribe({
println(" receiver data = $it")
}, { error ->
println(" error msg = ${error.message} ")
}, {
println(" completed ")
})
此时运行代码,结果如下:
error msg = For input string: "ddd"
总结:
写代码时注意异常情况处理,不要大意觉得此处不会出问题而放弃类似异常处理或者if-else分之处理,代码只要执行就要做好有出问题的准备