公司的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分之處理,代碼只要執行就要做好有出問題的準備