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

时间:2016-04-19 08:28:17

标签: rx-java

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

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

2 个答案:

答案 0 :(得分:4)

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

subscribe有多个重载,允许您将onNextonErroronCompleted作为单独的函数提供。然后使用这些函数来实现Observer接口。如果您不提供所有三个功能(仅限onNext),onError接口的Observer方法是通过抛出OnErrorNotImplementedException来实现的。

大概你的代码看起来像这样

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

您不仅可以在onNext中提供subscribe实施,还可以提供onError实施,从而抓住'此例外:

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

关于你的上一个问题“我是否应该始终实现onError功能?”:从技术上讲,不是,如果您确定{{1},则不需要}(或Observable)不会产生错误。但在实践中,至少记录此类错误甚至使用SubjectonErrorResumeNext等运算符从中恢复是一个明智的想法。您可以在documentation

中找到有关它们的所有信息

答案 1 :(得分:0)

请注意可能导致错误的任何订阅。例如,我有一个订阅做一个断言,它第一次返回true但是当下一个值使断言抛出一个错误然后我的observable被这个异常错误捕获。