Android Retrofit请求API触发Collection.isEmpty()空指针异常如何修复
问题根因
报错是空指针异常,触发位置是NewsRemoteDataSource.kt第21行调用results.isNotEmpty()时,NewsListResponse实例的results字段为null,直接调用集合方法触发崩溃。
有两个核心诱因:
- 代码未对
results字段做非空校验就直接调用集合方法 - API响应结构体映射错误:你定义的
NewsResponse中新闻列表字段是articles,但NewsListResponse中的字段命名为results,且未加序列化注解映射,Gson解析时找不到对应字段会直接赋值null
修复方案
1. 修复远程数据源的空指针问题
修改NewsRemoteDataSource中onResponse的逻辑,增加results非空校验:
override fun onResponse( call: Call<NewsListResponse>, response: Response<NewsListResponse> ) { val resource = response.body()?.run { // 增加空判断,只有results非空且不为空集合时才返回成功 if (results?.isNotEmpty() == true) Resource(NetworkStatus.SUCCESS, results) else Resource(NetworkStatus.ERROR) } ?: run { Resource(NetworkStatus.ERROR) } networkResponse.onResponse(resource) }
2. 修正API响应结构体映射
给NewsListResponse的results字段增加序列化注解,和实际API返回的articles字段对应,同时声明为可空类型提升安全性:
data class NewsListResponse( @SerializedName("articles") val results: List<ArticlesData>? )
3. 额外健壮性优化(可选,避免后续崩溃)
- 给RecyclerAdapter的列表参数增加默认空列表,避免初始化时传空崩溃:
class RecyclerAdapter (private var Articles: List<ArticlesData> = emptyList()) : RecyclerView.Adapter<RecyclerAdapter.ViewHolder>()
- Picasso加载图片时增加错误占位图,避免空链接加载失败:
Picasso.get() .load(articles.urlToImage) .placeholder(R.drawable.ic_placeholder) // 替换为你项目内的占位图资源 .error(R.drawable.ic_error) .into(binding.ivNewsImage)
以上修改完全保留原有回调逻辑,接口请求成功且返回有效新闻列表时会正常走成功回调返回数据,空数据/解析失败的场景会走错误逻辑不会崩溃。
内容的提问来源于stack exchange,提问作者dazai
相关产品推荐
相关产品推荐

