RxJava2 OnErrorNotImplementedException解決辦法

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章