You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 10:12:01