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
相关产品推荐
相关产品推荐

