我的应用程序方法中有以下代码,它从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?这怎么可能呢?