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

Android中Retrofit调用sendSMS方法出现空对象引用错误求助

排查Retrofit空对象引用错误:Attempt to invoke interface method on null object reference

错误原因分析

你碰到的这个NullPointerException核心问题很明确:调用sendSMS方法时,对应的LoginServices实例是null。从你贴的代码来看,问题出在RetrofitClient类的服务获取逻辑上:

  • getServies()方法是空实现,完全没有返回LoginServices的实例
  • 这个方法还是实例方法,调用起来既麻烦又容易出错
  • 你注释掉的那行代码才是创建LoginServices实例的正确写法,但没启用

修复步骤

1. 重构RetrofitClient的服务获取方法

修改RetrofitClient类,把服务获取改成静态方法并补全实现:

package com.webdealer.otexconnect.goldback.network;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {
    private static Retrofit retrofit = null;
    // 替换成你实际的接口基础地址,注意结尾要加/
    private static final String BASE_URL = "https://your-api-domain.com/";

    public static Retrofit getClient(String baseUrl) {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }

    // 改为静态方法,直接返回LoginServices实例
    public static LoginServices getServices(){
        return getClient(BASE_URL).create(LoginServices.class);
    }
}

2. 补全LoginServices中的sendSMS方法

从错误信息看你调用了sendSMS,但你贴的接口代码里没有这个方法,需要补充完整(根据实际接口参数调整):

@FormUrlEncoded
@POST("send-sms") // 替换成实际的短信接口路径
Call<Sms> sendSMS(@Field("phone") String phone); // 字段名和类型匹配后端接口

3. 正确获取实例并调用接口

在需要调用短信接口的地方,按以下方式获取实例并执行请求:

// 获取有效的LoginServices实例
LoginServices loginServices = RetrofitClient.getServices();
// 调用sendSMS方法
Call<Sms> call = loginServices.sendSMS("13800138000");
// 异步执行请求
call.enqueue(new Callback<Sms>() {
    @Override
    public void onResponse(Call<Sms> call, Response<Sms> response) {
        // 处理成功响应逻辑
    }

    @Override
    public void onFailure(Call<Sms> call, Throwable t) {
        // 处理请求失败逻辑
    }
});

额外注意事项

  • 确保BASE_URL格式正确,必须以/结尾,否则Retrofit会解析出错
  • 如果你的App目标SDK是Android 9及以上,HTTP请求需要在AndroidManifest.xml的<application>标签里添加android:usesCleartextTraffic="true",或者优先使用HTTPS接口
  • 如果有多个不同基础地址的接口,不要复用同一个retrofit实例,可调整getClient方法逻辑避免实例冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:02:21