我的app方法中有以下代码,它从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:尝试从com.app.android.domain上的空对象引用上的字段'java.lang.String com.app.android.domain.data.cache.DbCacheEntry.value'中读取.data.repositories.DataRepository.lambda $ getFavorites $ 17(DataRepository.java:60)位于io.reactivex.internal.operators的com.app.android.domain.data.repositories.DataRepository $$ Lambda $ 1.call(未知来源)位于io.reactivex.Observable.subscribe(Observable.java:10838)的.observable.ObservableFromCallable.subscribeActual(ObservableFromCallable.java:42)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)在io.react的io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61) ivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)at java.util.concurrent.FutureTask.run(FutureTask.java:237)at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201(ScheduledThreadPoolExecutor.java) :154)at java.util.concurrent.cheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)at java.util.concurrent.ThreadPoolExecutor $ Worker . 在java.lang.Thread.run上运行(ThreadPoolExecutor.java:588)(Thread.java:818)

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