Android RX开发中如何优雅处理response.body()为null的异常
方案1:通过操作符提前处理响应,统一走错误管道
你可以在subscribe之前通过map操作符对响应做非空校验,一旦body()为空直接抛出异常,所有异常会统一走到subscribe的error回调中,无需重复编写异常处理逻辑:
repository.getUserList() .subscribeOn(Schedulers.io()) .map { response -> response.body() ?: throw NullPointerException("response body is empty") } .observeOn(AndroidSchedulers.mainThread()) .subscribe({ userList -> view.showUser(userList) }, { throwable -> handleException(view, throwable) }).addToDisposable()
这种方式将业务逻辑和异常处理完全拆分,代码结构更清晰,也规避了手动写try-catch的冗余代码。
方案2:使用filter过滤空响应,无有效数据时跳过执行
如果空body的场景不需要触发错误提示,仅需静默跳过UI更新逻辑,可以搭配filter操作符实现:
repository.getUserList() .subscribeOn(Schedulers.io()) .filter { it.body() != null } .map { it.body()!! } .observeOn(AndroidSchedulers.mainThread()) .subscribe({ userList -> view.showUser(userList) }, { throwable -> handleException(view, throwable) }).addToDisposable()
由于已经通过filter提前过滤了body为空的情况,后续!!调用是绝对安全的,不会触发空指针异常。
方案3:降级处理空响应,返回默认值
如果允许空body时展示空状态,可以直接在map中返回默认值,不会触发错误回调:
repository.getUserList() .subscribeOn(Schedulers.io()) .map { response -> response.body() ?: emptyList() } .observeOn(AndroidSchedulers.mainThread()) .subscribe({ userList -> view.showUser(userList) }, { throwable -> handleException(view, throwable) }).addToDisposable()
额外优化建议:如果你使用的是Retrofit,可直接将接口返回值定义为Observable<List<User>>而非Observable<Response<List<User>>>,Retrofit会自动处理body为空的场景,直接将错误下发到onError回调,无需你手动处理Response包装类。
内容的提问来源于stack exchange,提问作者GHH
相关产品推荐
相关产品推荐

