io.reactivex.exceptions.OnErrorNotImplementedException: The mapper function returned a null value.

本文介绍在使用RxJava进行网络请求时遇到的OnErrorNotImplementedException异常,并提供了三种有效的异常捕获和处理方法,包括使用subscribe、Observer和RxJavaPlugins。

问题:

io.reactivex.exceptions.OnErrorNotImplementedException: The mapper function returned a null value.

需要捕获异常:
方法一:

HttpServicesFactory2.getHttpServiceApi().getFileBase64(imgZj)
     .subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(new Consumer<HttpBaseResult<String>>() {
         @Override
         public void accept(HttpBaseResult<String> stringHttpBaseResult) throws Exception {
             ResponseResult<String> result = stringHttpBaseResult.getResult();
             String data = result.getData();
         }
     }, new Consumer<Throwable>() {
         @Override
         public void accept(Throwable throwable) throws Exception {
             LegoLog.d(throwable.getMessage());
         }
     });

方法二:

HttpServicesFactory2.getHttpServiceApi().getFileBase64(imgZj)
     .subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(new Observer<HttpBaseResult<String>>() {

         @Override
         public void onSubscribe(Disposable d) {

         }

         @Override
         public void onNext(HttpBaseResult<String> stringHttpBaseResult) {

         }

         @Override
         public void onError(Throwable e) {

         }

         @Override
         public void onComplete() {

         }
     });

方法三:

RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        throwable.printStackTrace();//这里处理所有的Rxjava异常
    }
});
//不处理异常
RxJavaPlugins.setErrorHandler(Functions.emptyConsumer());

参考:https://blog.youkuaiyun.com/qingchenba/article/details/86659987

`io.reactivex.exceptions.CompositeException: 2 exceptions occurred` 表示在 RxJava 执行过程中同时发生了两个异常,被合并成了一个 `CompositeException`。以下是一些可能的解决方法: ### 1. 捕获并处理异常 在 RxJava 链中使用 `onErrorResumeNext` 或 `onErrorReturn` 操作符来捕获并处理异常。示例代码如下: ```java import io.reactivex.Observable; import io.reactivex.functions.Function; public class RxJavaErrorHandling { public static void main(String[] args) { Observable.just(1, 2, 3) .map(new Function<Integer, Integer>() { @Override public Integer apply(Integer integer) throws Exception { if (integer == 2) { throw new RuntimeException("Error for value 2"); } return integer; } }) .onErrorResumeNext(Observable.empty()) .subscribe(System.out::println); } } ``` 在上述代码中,`onErrorResumeNext` 操作符在遇到异常时返回一个空的 `Observable`,避免异常继续传播。 ### 2. 检查取消订阅情况 确保在取消订阅后,请求线程不会继续执行并抛出异常。可以使用 `takeUntil` 操作符来控制订阅的生命周期。示例代码如下: ```java import io.reactivex.Observable; import io.reactivex.subjects.PublishSubject; public class RxJavaCancelSubscription { public static void main(String[] args) { PublishSubject<Boolean> stopSignal = PublishSubject.create(); Observable.just(1, 2, 3) .takeUntil(stopSignal) .subscribe(System.out::println); // 发送取消订阅信号 stopSignal.onNext(true); } } ``` 在上述代码中,`takeUntil` 操作符在接收到 `stopSignal` 时停止订阅,避免后续异常的产生。 ### 3. 日志记录和调试 在 `subscribe` 方法中添加 `onError` 回调,记录异常信息,以便更好地定位问题。示例代码如下: ```java import io.reactivex.Observable; public class RxJavaLogging { public static void main(String[] args) { Observable.just(1, 2, 3) .map(integer -> { if (integer == 2) { throw new RuntimeException("Error for value 2"); } return integer; }) .subscribe( System.out::println, throwable -> System.err.println("Error: " + throwable.getMessage()) ); } } ``` 在上述代码中,`onError` 回调记录了异常信息,方便调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐诺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值