Не удается обработать ошибку при использовании Flowable в Rxjava - PullRequest
0 голосов
/ 03 октября 2018
Flowable.just(getSize())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .onExceptionResumeNext { Flowable.just(10) }
            .onErrorResumeNext(Flowable.just(10))
            .doOnError { throwable -> Logger.log("caught in doOnError") }
            .subscribe({ size -> showSizeOnUi(size) },
                    { throwable -> Logger.log("caught in onError") })

Функция getSize () вызовет исключение NullPointer.

 private fun getSize(): Int {
    val path: String? = null
    return path!!.length  // attempts to call length on null string (path)
}

Насколько я знаю, если getSize () выдает какое-либо исключение, тогда должен быть передан элемент управления onExceptionResumeNext, который затем вернет'10', и это значение должно идти в onNext () "{size -> showSizeOnUi (size)}" .Но в этом случае приложение просто вылетает.Могу ли я предотвратить этот сбой с помощью любого резервного механизма?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Выражение Flowable.just(getSize()) немедленно выбрасывает NPE, как объясняет @ bob-dalgleish.Но вы можете отложить создание Flowable:

    Flowable.defer { Flowable.just(getSize()) }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .onExceptionResumeNext { Flowable.just(10) }
        .onErrorResumeNext(Flowable.just(10))
        .doOnError { throwable -> Logger.log("caught in doOnError") }
        .subscribe({ size -> showSizeOnUi(size) },
                { throwable -> Logger.log("caught in onError") })

Теперь Flowable.just(getSize()) будет вызываться на subscribe(), и RxJava может перехватить исключение.

0 голосов
/ 03 октября 2018

Выражение Flowable.just(getSize()) немедленно выбросит NullPointerException, и у RxJava нет возможности его перехватить.

Вам необходимо окружить весь оператор блоком try {...} catch (...) {...}.

...