2017-06-21 122 views
0

我正在使用RxJava,除了在引发这些错误的情况下,一切看起来都不错。RxJava序列不包含元素错误

Caused by: java.util.NoSuchElementException: Sequence contains no elements 
at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted(OperatorSingle.java:118) 
at rx.internal.operators.OperatorTake$1.onCompleted(OperatorTake.java:56) 
at rx.internal.operators.OnSubscribeFilter$FilterSubscriber.onCompleted(OnSubscribeFilter.java:99) 
at rx.internal.operators.OnSubscribeFromIterable$IterableProducer.slowpath(OnSubscribeFromIterable.java:134) 
at rx.internal.operators.OnSubscribeFromIterable$IterableProducer.request(OnSubscribeFromIterable.java:89) 
at rx.internal.operators.OperatorTake$1$1.request(OperatorTake.java:109) 
at rx.Subscriber.setProducer(Subscriber.java:211) 
at rx.internal.operators.OperatorTake$1.setProducer(OperatorTake.java:93) 
at rx.internal.operators.OnSubscribeFilter$FilterSubscriber.setProducer(OnSubscribeFilter.java:104) 
at rx.internal.operators.OnSubscribeFromIterable.call(OnSubscribeFromIterable.java:63) 
at rx.internal.operators.OnSubscribeFromIterable.call(OnSubscribeFromIterable.java:34) 
at rx.Observable.unsafeSubscribe(Observable.java:10211) 
at rx.internal.operators.OnSubscribeFilter.call(OnSubscribeFilter.java:45) 
at rx.internal.operators.OnSubscribeFilter.call(OnSubscribeFilter.java:30) 
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) 
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) 
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) 
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) 
at rx.Observable.unsafeSubscribe(Observable.java:10211) 
at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48) 
at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33) 
at rx.Observable.unsafeSubscribe(Observable.java:10211) 
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:250) 
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:147) 
at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:77) 
at rx.internal.operators.OperatorMerge$MergeSubscriber.emitScalar(OperatorMerge.java:399) 
at rx.internal.operators.OperatorMerge$MergeSubscriber.tryEmit(OperatorMerge.java:357) 
at rx.internal.operators.OperatorMerge$InnerSubscriber.onNext(OperatorMerge.java:852) 
at rx.internal.operato 

编辑: 的问题是在功能NumberObservables::mergeNumberAndName

public static Observable<Trailer> mergeTrailerType(Trailer trailer) { 
    String id = number.getId(); 
    return Observable.from(Store.names()) 
      .first(name -> id.equals(name.getId())) 
      .map(name -> { 
       number.setName(name); 
       return number; 
      }); 
} 

,我可以看到first使得问题,但我不能与采取更换(1)或firstOrDefault(找不到getId())。它可以与single一起使用吗?你可能在流(NumberObservables::getByNumberNumberObservables::mergeNumberAndName)的single()操作某处申请

回答

1

,它可以在堆栈跟踪这里可以观察到:

at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted(OperatorSingle.java:118) 

single()预计来源Observable发射只有一个项目,并通知错误的NoSuchElementException如果源可观察到发射没有任何项目,从堆栈跟踪,这可能是发生由于一些过滤器已应用于:

at rx.internal.operators.OnSubscribeFilter$FilterSubscriber.onCompleted(OnSubscribeFilter.java:99) 
+0

是的,我发现它现在,我在'NumberObservables :: mergeNumberAndName'中应用'.first'操作符,这就是为什么它会抛出异常。你知道我该如何解决它? – Claire

+0

好吧,很难说不理解你的逻辑,你可以使用'firstOrDefault'来提供默认值,但是通常你想从Observable中获得单个项目,而不是这样,所以你的逻辑要根据你期望的来完善在这种情况下发出 – yosriz

+0

我用函数NumberObservables :: mergeNumberAndName和其他细节改变了这个问题。你可以看到。 – Claire

相关问题