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

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的判断。

二、安卓端问题修复

  1. 不要用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;
}
  1. 你新建的ForgotPassRP类没有实际使用,要么将ApiInterface的getForgotPass返回值、ForgotPassword里的Call泛型都换成ForgotPassRP,要么删掉这个冗余类。
  2. 临时加调试日志打印原始响应内容,确认后端返回是否符合预期:在onResponse回调最前面加Log.d("RAW_RESPONSE", response.raw().body().string());,注意打印后后续response.body()会被消费,可以先把响应存成字符串再手动用Gson解析。

三、其他注意事项

  • 检查你ApiClient的Gson配置,是否有多余的字段排除策略、序列化配置导致解析失败,建议配置GsonBuilder().setLenient()兼容格式不规范的JSON。
  • 确认你Base64编码的请求参数后端能正常解析,从你提供的API日志看请求已经到后端,所以参数解析没问题,主要是返回结构问题。

内容的提问来源于stack exchange,提问作者programerGramer19

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:36:05