Android Studio中Retrofit请求API返回null触发java.lang.AssertionError如何解决
问题根因与修复方案
一、后端代码核心错误
你在PHP接口的发邮件失败分支有语法错误,导致返回JSON结构异常,Gson解析失败返回null,触发断言错误:
// 错误代码:少了msg键名 $row_info = array('success' => '0', $this->lang->line('email_not_sent')); // 修复为 $row_info = array('success' => '0', 'msg' => $this->lang->line('email_not_sent'));
另外还有两处潜在风险:
$user_info = $this->common_model->check_email($this->get_param['email'])[0];若邮箱不存在时check_email返回空数组,直接取[0]会抛出PHP索引异常,导致接口返回错误日志而非正常JSON,建议先判空再取值:
$check_result = $this->common_model->check_email($this->get_param['email']); if (!empty($check_result)) { $user_info = $check_result[0]; } else { // 走邮箱不存在的返回逻辑 }
- 你当前后端返回的响应里没有
status字段,但是安卓端DataRP类和业务逻辑都有判断status的代码,要么后端统一在响应里加status字段,要么安卓端去掉对status的判断。
二、安卓端问题修复
- 不要用
assert dataRP != null做非空判断,安卓Release包断言默认不生效,且response.body()本身就可能为空,改成手动非空判断:
DataRP dataRP = response.body(); if (dataRP == null) { // 打印原始响应排查问题 Log.d("API_RESPONSE", response.raw().toString()); method.alertBox(getResources().getString(R.string.failed_response)); return; }
- 你新建的
ForgotPassRP类没有实际使用,要么将ApiInterface的getForgotPass返回值、ForgotPassword里的Call泛型都换成ForgotPassRP,要么删掉这个冗余类。 - 临时加调试日志打印原始响应内容,确认后端返回是否符合预期:在
onResponse回调最前面加Log.d("RAW_RESPONSE", response.raw().body().string());,注意打印后后续response.body()会被消费,可以先把响应存成字符串再手动用Gson解析。
三、其他注意事项
- 检查你
ApiClient的Gson配置,是否有多余的字段排除策略、序列化配置导致解析失败,建议配置GsonBuilder().setLenient()兼容格式不规范的JSON。 - 确认你Base64编码的请求参数后端能正常解析,从你提供的API日志看请求已经到后端,所以参数解析没问题,主要是返回结构问题。
内容的提问来源于stack exchange,提问作者programerGramer19
相关产品推荐
相关产品推荐

