RxJava2 Single在处理运行时异常后引发且未捕获

RxJava2 Single在处理运行时异常后引发且未捕获,java,android,exception,rx-java2,Java,Android,Exception,Rx Java2,RxJava2 Single中抛出的RuntimeException不会被捕获,并且如果观察者已被释放,也不会被发送到观察者的onError()方法。 我知道调用CompositeDisposable.dispose()意味着我的订阅者的onSuccess或onError方法将不会被调用,但异常是否也应该被忽略?相反,应用程序正在崩溃,因为未捕获RuntimeException 下面是一行,带有注释的行可以引发RuntimeException,如果在调用.dispose()方法之前引发异常,则会

RxJava2 Single中抛出的RuntimeException不会被捕获,并且如果观察者已被释放,也不会被发送到观察者的onError()方法。
我知道调用CompositeDisposable.dispose()意味着我的订阅者的onSuccess或onError方法将不会被调用,但异常是否也应该被忽略?相反,应用程序正在崩溃,因为未捕获RuntimeException

下面是一行,带有注释的行可以引发RuntimeException,如果在调用.dispose()方法之前引发异常,则会捕获该异常并将错误发送给订阅者,但如果在调用.dispose()之后引发异常,则应用程序会崩溃

public Single<Submission> getSubmission(final String threadId, final CommentSort sort) {
        return Single.create(new SingleOnSubscribe<Submission>() {
            @Override
            public void subscribe(SingleEmitter<Submission> e) throws Exception {
                // some irrelevant code

                try {
                    submission = reddit.getSubmission(sr); // Can throw RuntimeException
                    e.onSuccess(submission);
                } catch (Exception ex) {
                    e.onError(ex);
                }
            }
        });
    }  
publicssinglegetsubmission(最终字符串threadId,最终注释排序){
返回Single.create(新建SingleOnSubscribe(){
@凌驾
public void subscribe(singlee)引发异常{
//一些无关的代码
试一试{
submission=reddit.getSubmission(sr);//可以引发RuntimeException
e、 成功(提交);
}捕获(例外情况除外){
e、 onError(ex);
}
}
});
}  
我订阅的代码:

disposables.add(someCompletable
                .andThen(service.getSubmission(threadId, CommentSort.HOT))
                .subscribeOn(schedulerProvider.io())
                .observeOn(schedulerProvider.ui())
                .subscribeWith(new DisposableSingleObserver<Submission>() {
                    @Override
                    public void onSuccess(Submission submission) {
                        // Handle result
                    }

                    @Override
                    public void onError(Throwable e) {
                        // Handle error
                    }
                })
        );
disposables.add(一些可完成的)
.andThen(service.getSubmission(threadId,CommentSort.HOT))
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.subscribowith(新的可处置SingleObserver(){
@凌驾
成功时公开作废(提交){
//处理结果
}
@凌驾
公共无效申报人(可丢弃的e){
//处理错误
}
})
);
堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-2
Process: com.gmail.jorgegilcavazos.ballislife.debug, PID: 15242
java.lang.RuntimeException: Unable to parse JSON: [{"kind": "Listing", "data": {"modhash": null, "children": [{"kind": "t3", "data
at net.dean.jraw.util.JrawUtils.fromString(JrawUtils.java:182)
at net.dean.jraw.http.RestResponse.<init>(RestResponse.java:64) 
at net.dean.jraw.http.OkHttpAdapter.execute(OkHttpAdapter.java:81)
at net.dean.jraw.http.RestClient.execute(RestClient.java:120)
at net.dean.jraw.RedditClient.execute(RedditClient.java:143)
at net.dean.jraw.RedditClient.execute(RedditClient.java:137)
at net.dean.jraw.RedditClient.getSubmission(RedditClient.java:287)
at com.gmail.jorgegilcavazos.ballislife.network.API.RedditService$10.subscribe(RedditService.java:311)
at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39)
at io.reactivex.Single.subscribe(Single.java:2656)
at io.reactivex.internal.operators.single.SingleDelayWithCompletable$OtherObserver.onComplete(SingleDelayWithCompletable.java:70)
at io.reactivex.internal.disposables.EmptyDisposable.complete(EmptyDisposable.java:67)
at io.reactivex.internal.operators.completable.CompletableEmpty.subscribeActual(CompletableEmpty.java:27)
at io.reactivex.Completable.subscribe(Completable.java:1592)
at io.reactivex.internal.operators.single.SingleDelayWithCompletable.subscribeActual(SingleDelayWithCompletable.java:36)
at io.reactivex.Single.subscribe(Single.java:2656)
E/AndroidRuntime:致命异常:RxCachedThreadScheduler-2
进程:com.gmail.jorgegilcavazos.ballislife.debug,PID:15242
java.lang.RuntimeException:无法解析JSON:[{“种类”:“列表”,“数据”:{“modhash”:null,“子项”:[{“种类”:“t3”,“数据”
位于net.dean.jraw.util.JrawUtils.fromString(JrawUtils.java:182)
在net.dean.jraw.http.RestResponse(RestResponse.java:64)
http.OkHttpAdapter.execute(OkHttpAdapter.java:81)
net.dean.jraw.http.RestClient.execute(RestClient.java:120)
net.dean.jraw.RedditClient.execute(RedditClient.java:143)
位于net.dean.jraw.RedditClient.execute(RedditClient.java:137)
位于net.dean.jraw.RedditClient.getSubmission(RedditClient.java:287)
登录com.gmail.jorgegilcavazos.ballislife.network.API.RedditService$10.subscribe(RedditService.java:311)
位于io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39)
在io.reactivex.Single.subscribe上(Single.java:2656)
在io.reactivex.internal.operators.single.SingleDelayWithCompletable$OtherObserver.onComplete(SingleDelayWithCompletable.java:70)
位于io.reactivex.internal.disposables.EmptyDisposable.complete(EmptyDisposable.java:67)
在io.reactivex.internal.operators.completable.CompletableEmpty.subscribeActual(CompletableEmpty.java:27)处
位于io.reactivex.Completable.subscribe(Completable.java:1592)
位于io.reactivex.internal.operators.single.SingleDelayWithCompletable.subscribeActual(SingleDelayWithCompletable.java:36)
在io.reactivex.Single.subscribe上(Single.java:2656)
找到了答案:

RxJava 2的设计目的是确保不会丢失错误。因此,当序列结束或取消时,发射器无处发送错误,因此它会被路由到
RxJavaPlugins.onError

与1.x不同,2.x默认调用
Thread.currentThread().getUncaughtExceptionHandler().uncaughtException()
,这会使Android应用程序崩溃


在我的例子中,由于订阅服务器已被释放,我不再关心发射器可能抛出的错误,因此发射器应该在调用
onError()


你确定你没有加入“一些不相关的代码”?
try {
      Submission submission = redditClient.getSubmission(sr);
      e.onSuccess(submission);
} catch (Exception ex) {
      if (!e.isDisposed()) {
           e.onError(ex);
      }
}