RxJava序列不包含元素错误
问题描述:
我正在使用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::getByNumber
或NumberObservables::mergeNumberAndName
)的single()
操作某处申请
答
,它可以在堆栈跟踪这里可以观察到:
at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted(OperatorSingle.java:118)
single()
预计来源Observable
发射只有一个项目,并通知错误的NoSuchElementException
如果源可观察到发射没有任何项目,从堆栈跟踪,这可能是发生由于一些过滤器已应用于:
at rx.internal.operators.OnSubscribeFilter$FilterSubscriber.onCompleted(OnSubscribeFilter.java:99)
是的,我发现它现在,我在'NumberObservables :: mergeNumberAndName'中应用'.first'操作符,这就是为什么它会抛出异常。你知道我该如何解决它? – Claire
好吧,很难说不理解你的逻辑,你可以使用'firstOrDefault'来提供默认值,但是通常你想从Observable中获得单个项目,而不是这样,所以你的逻辑要根据你期望的来完善在这种情况下发出 – yosriz
我用函数NumberObservables :: mergeNumberAndName和其他细节改变了这个问题。你可以看到。 – Claire