rxjava2 onErrorResumeNext未调用

时间:2017-08-22 13:58:48

标签: java android rx-java2

我的应用程序方法中有以下代码,它从db返回一些缓存数据。

 return Observable.fromCallable(() -> {
            String json = cacheDb.cacheDao().loadByKey(key).value;
            return json != null ? gson.fromJson(json, Data.class) : null;
        }).onErrorResumeNext(throwable -> {return Observable.just(Collections.emptyList()); });

我使用Schedulers.io()调度程序订阅了这个observable,并在主线程调度程序上观察它。 问题是:在将此代码发布到生产后,我开始收到结构崩溃:

  

致命异常:java.lang.NullPointerException:尝试从字段中读取' java.lang.String com.app.android.domain.data.cache.DbCacheEntry.value'在null对象引用上          在com.app.android.domain.data.repositories.DataRepository.lambda $ getFavorites $ 17(DataRepository.java:60)          在com.app.and.andmain.data.repositories.DataRepository $$ Lambda $ 1.call(未知来源)          at io.reactivex.internal.operators.observable.ObservableFromCallable.subscribeActual(ObservableFromCallable.java:42)          at io.reactivex.Observable.subscribe(Observable.java:10838)          at io.reactivex.internal.operators.observable.ObservableOnErrorNext.subscribeActual(ObservableOnErrorNext.java:38)          at io.reactivex.Observable.subscribe(Observable.java:10838)          at io.reactivex.internal.operators.observable.ObservableSubscribeOn $ SubscribeTask.run(ObservableSubscribeOn.java:96)          at io.reactivex.Scheduler $ DisposeTask.run(Scheduler.java:452)          at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)          at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)          在java.util.concurrent.FutureTask.run(FutureTask.java:237)          at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201(ScheduledThreadPoolExecutor.java:154)          at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)          在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)          at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588)          在java.lang.Thread.run(Thread.java:818)

这个日志完全可以理解,除了一件事:为什么在这样的NullPointerException情况下没有调用onErrorResumeNext?我试图通过在callable中抛出一个新的异常来重现这个问题并没有成功,但它总是遇到于ErrorResumeNext。为什么在生产中不调用onErrorResumeNext?这怎么可能呢?

0 个答案:

没有答案