每日一问-Android-20181031为什么 HTTP Code 204 会导致 Retrofit 出现 NullPointerException?答:
今天在做网络接口的时候, 一个返回结果应该是 的接口出现了异常:
根据错误信息, 进入代码可得:
此处代码, 说明服务器返回的成功,已经进入 onNext 回调了, 但是其 value 是 null, 我们在往上看调用信息, 在实际的 方法中将 Response 进行传递.
这里的 Response 是 retrofit 内置的 Resonse 不是 Okhttp 里面的 Response, 部分代码如下:
这个 Response 怎么来的呢?看 方法这个代码块:
是 Okhttp 的 Call 的执行结果, 这里的实现类是:
Call 执行以后对结果进行解析处理:
重点来了:在这个解析的代码中, 如果服务器返回的 HTTP Code 是 204 或者 205, 那么其 body 会置为 null, 所以会出现 NullPointException
那么, HTTP Code 204 是什么意思呢? 这里引用 Mozilla 的说明:
HTTP协议中 204 No Content 成功状态响应码表示目前请求成功,但客户端不需要更新其现有页面。204 响应默认是可以被缓存的。在响应中需要包含头信息 ETag。
其实就是, 请求服务器成功了, 但是没有数据返回给你.
实际的网络请求是什么样呢(接口已做马赛克处理)?
从日志上上看,服务器确实返回了 204, 那么我们怎么处理这个异常呢?
从实际的现象来看, 这个异常只是打印了异常信息, 而不会引发程序的崩溃. 个人认为可以这样处理:
不做任何处理
将此 204 使用 Observable 的 map 转换分发到 onException 分支
如果服务器返回的数据格式类似下面这样:
那就在 结果返回时添加 Function 转换, 返回一个data 为 null 的 JavaBean.
操作过程:
1.将 rest service 的接口返回值改为:
2.创建新的 Function类:
调用处在处理数据的时候要做判 null 处理.
领取专属 10元无门槛券
私享最新 技术干货