onError 抱怨提供的价值

onError complains about supplied value

我喜欢 RxJava,但我不得不承认,有时它很难调试。

我收到一个错误

Fatal Exception: java.lang.NullPointerException: Value supplied was null
       at io.reactivex.internal.operators.single.SingleOnErrorReturn$OnErrorReturn.onError(SingleOnErrorReturn.java:66)
       at io.reactivex.internal.operators.single.SingleDelayWithCompletable$OtherObserver.onError(SingleDelayWithCompletable.java:64)
       at io.reactivex.internal.operators.completable.CompletableFromSingle$CompletableFromSingleObserver.onError(CompletableFromSingle.java:41)
       at io.reactivex.internal.operators.single.SingleOnErrorReturn$OnErrorReturn.onError(SingleOnErrorReturn.java:68)
       at io.reactivex.internal.observers.ResumeSingleObserver.onError(ResumeSingleObserver.java:51)
       at io.reactivex.internal.disposables.EmptyDisposable.error(EmptyDisposable.java:78)
       at io.reactivex.internal.operators.single.SingleError.subscribeActual(SingleError.java:42)
       at io.reactivex.Single.subscribe(Single.java:3666)
       at io.reactivex.internal.operators.single.SingleResumeNext$ResumeMainSingleObserver.onError(SingleResumeNext.java:80)
       at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onError(SingleMap.java:69)
       at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onError(SingleMap.java:69)
       at io.reactivex.internal.operators.observable.ObservableToListSingle$ToListObserver.onError(ObservableToListSingle.java:104)
       at io.reactivex.observers.SerializedObserver.onError(SerializedObserver.java:153)
       at io.reactivex.internal.operators.observable.ObservableConcatMap$SourceObserver.onError(ObservableConcatMap.java:142)
       at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.tryOnError(ObservableCreate.java:84)
       at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError(ObservableCreate.java:72)
       at it.mypackage.data.source.aws.LegDataSourceLegsListener.onFailure(LegADataSource.java:760)
       at com.apollographql.apollo.GraphQLCall$Callback.onNetworkError(GraphQLCall.java:135)
       at com.apollographql.apollo.internal.RealAppSyncCall.onFailure(RealAppSyncCall.java:259)
       at com.apollographql.apollo.internal.interceptor.ApolloCacheInterceptor.onFailure(ApolloCacheInterceptor.java:108)
       at com.apollographql.apollo.internal.interceptor.ApolloParseInterceptor.onFailure(ApolloParseInterceptor.java:94)
       at com.apollographql.apollo.internal.interceptor.ApolloServerInterceptor.onFailure(ApolloServerInterceptor.java:105)
       at okhttp3.RealCall$AsyncCall.run(RealCall.kt:146)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
       at java.lang.Thread.run(Thread.java:764)

错误似乎来自这个片段:

@Override
public void onFailure(@Nonnull ApolloException e) {
     if (!emitter.isDisposed()) {
           emitter.onError(e); // here's the problem
     }
}

现在的问题是 ApolloException 不为空,还要检查实现我可以说不应该有空作为 onFailure 的参数。

callBack.onFailure(new ApolloNetworkException("Failed to execute http call", e));

那么,这个错误从何而来?
有什么想法吗?

注意:我使用的是 RxJava2,版本 2.3.4

NullPointerException 具体来自 SingleOnErrorReturn$OnErrorReturn.OnError:

        public void onError(Throwable e) {
            T v;

            if (valueSupplier != null) {
                try {
                    v = valueSupplier.apply(e);
                } catch (Throwable ex) {
                    Exceptions.throwIfFatal(ex);
                    observer.onError(new CompositeException(e, ex));
                    return;
                }
            } else {
                v = value;
            }

            if (v == null) {
                NullPointerException npe = new NullPointerException("Value supplied was null");  // This is the exception you're hitting
                npe.initCause(e);
                observer.onError(npe);
                return;
            }

它抱怨的 v 是实际传递给 onErrorReturn(T value) 运算符的 value。传的valuenull,这是不允许的

所以我会在 t.mypackage.data.source.aws.LegDataSourceLegsListener.onFailure 下游寻找一个 onErrorReturn 运算符,它采用 null 值。根据堆栈跟踪,它看起来会出现在 .delaySubscription(Completable) 运算符之后。