使用Retrofit库时App崩溃,出现NullPointerException问题求助
Retrofit NullPointerException 解决方案
崩溃原因
日志明确指出:null cannot be cast to non-null type kotlin.collections.MutableList<...>,问题出在这行代码:
list=response.body() as MutableList<animaldashmodel>
两个核心问题:
- Retrofit的
response.body()可能返回null(比如接口返回空、HTTP状态码非2xx),直接用非空强转as会触发kotlin的NullPointerException - 就算接口返回了List,Retrofit默认返回的是不可变List,直接强转MutableList也存在类型转换风险
修复代码
修改onResponse方法,加入空判断+安全转换逻辑:
override fun onResponse( call: Call<List<animaldashmodel>>, response: Response<List<animaldashmodel>> ) { // 先校验请求是否成功且返回数据不为空 if (response.isSuccessful && response.body() != null) { // 安全将不可变List转为MutableList list = response.body()!!.toMutableList() val adapter = Animal_Dashboard_Adapter(this@Animal_Dashboardview_activity, list) binding.recycle.adapter = adapter } else { // 处理请求失败或空数据场景 Toast.makeText(applicationContext, "数据加载失败", Toast.LENGTH_SHORT).show() // 可选:给RecyclerView设置空状态视图/适配器 } }
额外优化建议
- 不要直接传
applicationContext给适配器,建议用当前Activity的上下文this@Animal_Dashboardview_activity,降低内存泄漏风险 - 给
list变量设置默认值(比如val list = mutableListOf<animaldashmodel>()),避免后续使用时出现空指针 - 在
onFailure中打印错误日志,方便排查问题:override fun onFailure(call: Call<List<animaldashmodel>>, t: Throwable) { t.printStackTrace() Toast.makeText(applicationContext, "网络错误:${t.message}", Toast.LENGTH_SHORT).show() }
内容的提问来源于stack exchange,提问作者Babariya Rutviksinh
相关产品推荐
相关产品推荐

