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);
一些问题...除了错误处理程序之外,为什么还没有显示实际错误?其次,我想在哪里实现这个功能?我究竟如何向主题添加错误处理程序。谢谢这是崩溃我的应用程序,甚至没有显示实际错误。我想我应该总是实现错误处理程序?
答案 0 :(得分:4)
RxJava有一个Observable
和一个Observer
。您可以将Observable
视为流的来源,您可以在其中执行map
和filter
等操作。 Observer
有点接收器:它是一个接口,有三种方法(onNext
,onError
和onCompleted
)由Observable
。您可以通过Observable
方法连接Observer
和Observable.subscribe(...)
。
subscribe
有多个重载,允许您将onNext
,onError
和onCompleted
作为单独的函数提供。然后使用这些函数来实现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
)不会产生错误。但在实践中,至少记录此类错误甚至使用Subject
或onErrorResumeNext
等运算符从中恢复是一个明智的想法。您可以在documentation。
答案 1 :(得分:0)
请注意可能导致错误的任何订阅。例如,我有一个订阅做一个断言,它第一次返回true但是当下一个值使断言抛出一个错误然后我的observable被这个异常错误捕获。