Rx java 在Rxjava中使用Flowable时无法处理错误

Rx java 在Rxjava中使用Flowable时无法处理错误,rx-java,rx-java2,Rx Java,Rx Java2,getSize()函数将引发NullPointer异常 Flowable.just(getSize()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .onExceptionResumeNext { Flowable.just(10) } .onErrorResumeNext(Flowable.jus

getSize()函数将引发NullPointer异常

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()引发任何异常,则应将controll赋予OneExceptionResumeNext,然后它将返回“10”,并且该值应转到onNext()“{size->showSizeOnUi(size)}”。但在这种情况下,应用程序只是崩溃。 我可以通过任何回退机制防止此崩溃吗


谢谢。

表达式可流动。just(getSize())将立即抛出
NullPointerException
,RxJava没有机会捕捉它


您需要用
try{…}catch(…){…}
块包围整个语句。

表达式
Flowable.just(getSize())
将立即抛出NPE,正如@bob dalgleish解释的那样。但您可以推迟创建可流动的

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

现在
Flowable.just(getSize())
将在
subscribe()
上被调用,RxJava能够捕获异常。

这是对
just
的常见误解。它接受一个已经存在的值。推荐阅读:谢谢你的链接。现在,我相信我有两个选择。延迟和呼叫。此外,在您的情况下,似乎必须是一个单一的。谢谢您的解释。之前我使用的是try-catch块。但现在我正在寻找一些用于处理异常的内置机制。谢谢。我想干什么就干什么。但是现在我使用的是fromCallable{},因为我只需要一次可观察。
    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") })