rx.exceptions.OnErrorNotImplementedException如何避免此错误 - 它使我的应用程序崩溃

Fun*_*ive 7 rx-java

com.myapp.test.debug E/MessageQueue-JNI:rx.Observable $ 31.onError(Observable.java:7134)处的rx.observers.SafeSubscriber._onError(SafeSubscriber.java:154)处的rx.exceptions.OnErrorNotImplementedException.观察者.SafeSubscriber.onError(SafeSubscriber.java:111)at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:137)at rx.subjects.SubjectSubscriptionManager $ SubjectObserver.onNext(SubjectSubscriptionManager.java:224)at rx.subjects.PublishSubject .onNext(PublishSubject.java:121)at com.myapp.MyClass.lambda $ static $ 53(MyClass.java:77)其中MyClass.java 77 MySubject.onNext(event);

几个问题...除了错误处理程序之外,为什么还没有显示实际错误?其次,我想在哪里实现这个功能?我究竟如何向主题添加错误处理程序.谢谢这是崩溃我的应用程序,甚至没有显示实际错误.我想我应该总是实现错误处理程序?

Rva*_*est 4

RxJava 有一个Observable和一个Observer. 您可以将 视为Observable流的map,您可以在其中执行和 等操作filter。它Observer是一种接收器:它是一个具有三个方法(和)的接口onNextonErroronCompleted触发Observable。您可以通过方法连接Observableand 。ObserverObservable.subscribe(...)

它有多个重载subscribe,允许您提供onNext,onErroronCompleted作为单独的函数。然后使用这些函数来实现该Observer接口。如果您不提供所有三个函数(仅说onNext),则通过onError抛出.ObserverOnErrorNotImplementedException

想必你的代码看起来像这样

PublishSubject<Integer> subject = PublishSubject.create();
subject.subscribe(System.out::println); // I use a Java 8 lambda here for brevity
subject.onNext(1/0); // this causes an error for dividing by 0
Run Code Online (Sandbox Code Playgroud)

您不仅可以通过在 中提供实现,还可以提供一个实现来“捕获”此异常:onNextsubscribeonError

PublishSubject<Integer> subject = PublishSubject.create();
subject.subscribe(System.out::println, Throwable::printStacktrace);
subject.onNext(1/0);
Run Code Online (Sandbox Code Playgroud)

关于您的最后一个问题“我应该始终实现该onError功能吗?Observable ”:从技术上讲,不,如果您确定(或Subject) 不会产生错误,则不需要。然而在实践中,至少记录这种错误甚至使用像onErrorResumeNextor 这样的运算符从中恢复是一个聪明的想法retry您可以在文档中找到有关它们的所有信息。