Java 使用改装从REST获取响应时使用空指针
我正在使用改型与Android上的RESTAPI通信,但我得到一个错误NullPointerException,如下所示。我尝试使用postman,API工作正常,我得到了响应 java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“java.util.List ukmutilizer.project.com.ukm_utilizer.model.CheckEmail.getData()” 这是我的活动课Java 使用改装从REST获取响应时使用空指针,java,android,gson,retrofit2,Java,Android,Gson,Retrofit2,我正在使用改型与Android上的RESTAPI通信,但我得到一个错误NullPointerException,如下所示。我尝试使用postman,API工作正常,我得到了响应 java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“java.util.List ukmutilizer.project.com.ukm_utilizer.model.CheckEmail.getData()” 这是我的活动课 private void sendRequest(St
private void sendRequest(String checkEmail){
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<CheckEmail> call = apiService.getEmailStatus(checkEmail);
call.enqueue(new Callback<CheckEmail>() {
@Override
public void onResponse(Call<CheckEmail> call, Response<CheckEmail> response) {
CheckEmailData emailDataList = response.body().getData();
Log.d("Numer of Data : ", String.valueOf(response.body().getData()));
}
@Override
public void onFailure(Call<CheckEmail> call, Throwable t) {
Toast.makeText(CheckEmailPage.this, "Something went wrong!", Toast.LENGTH_SHORT).show();
Log.e("Error Retrofit : ", String.valueOf(t));
}
});
这是json响应
{
"code": 1000,
"message": "OK",
"data": {
"id": "1",
"email": "test@gmail.com",
"status": "1",
"name": "test",
"category": "2"
}
}
{
"code": 1000,
"message": "OK",
"data": {
"id": "1",
"email": "test@gmail.com",
"status": "1",
"name": "test",
"category": "2"
}
}
这是POJO
`public class CheckEmail {
@SerializedName("code")
@Expose
private Integer code;
@SerializedName("message")
@Expose
private String message;
@SerializedName("data")
@Expose
private CheckEmailData data;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public CheckEmailData getData() {
return data;
}
public void setData(CheckEmailData data) {
this.data = data;
}
}`
CheckEmailData POJO
`public class CheckEmailData {
@SerializedName("id")
@Expose
private String id;
@SerializedName("email")
@Expose
private String email;
@SerializedName("status")
@Expose
private String status;
@SerializedName("name")
@Expose
private String name;
@SerializedName("category")
@Expose
private String category;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}`
在访问响应中的数据之前,应该检查响应本身是否正常
@Override
public void onResponse(Call<CheckEmail> call, Response<CheckEmail> response) {
if(response.isSuccessfull()){
//if you are sure that when the response is OK the list is not null
//you can leave this line below to hide the lint warning, otherwise
//before accessing the list with getData() check that response.body() is not null
//noinspection ConstantConditions
List<CheckEmailData> emailDataList = response.body().getData();
Log.d("Numer of Data : ", String.valueOf(emailDataList.size()));
for (CheckEmailData emailData : emailDataList){
Log.d("Successfull : ", String.valueOf(emailData.getStatus()));
}
} else {
//you got an error response, handle it
}
}
@覆盖
公共void onResponse(调用、响应){
if(response.issucessfull()){
//如果您确定响应正常时,列表不为空
//否则,您可以将此行保留在下面以隐藏lint警告
//在使用getData()访问列表之前,请检查response.body()是否为null
//无检测恒定条件
List emailDataList=response.body().getData();
Log.d(“数据数量:”,String.valueOf(emailDataList.size());
对于(CheckEmailData emailData:emailDataList){
Log.d(“Successfull:”,String.valueOf(emailData.getStatus());
}
}否则{
//你有一个错误响应,处理它
}
}
json响应上的api中只有一个数据,即json对象
{
"code": 1000,
"message": "OK",
"data": {
"id": "1",
"email": "test@gmail.com",
"status": "1",
"name": "test",
"category": "2"
}
}
{
"code": 1000,
"message": "OK",
"data": {
"id": "1",
"email": "test@gmail.com",
"status": "1",
"name": "test",
"category": "2"
}
}
然而,您将数据声明为列表
对象,它期望上面的数据
为json数组格式
您应该将列表更改为
@SerializedName("data")
@Expose
private CheckEmailData data;
我相信这会很好。在JSON中,“数据”是一个对象,而不是数组。在你的
CheckEmail
类中,更改私有列表数据代码>至私人支票电子邮件数据代码>我已经解决了这个问题
我在界面上添加了标题,如下所示
public interface ApiInterface {
@Headers({
"Content-Type:application/x-www-form-urlencoded"
})
@POST("v1/users/check_status")
Call<CheckEmail> getEmailStatus(@Body String email);
}
公共接口{
@标题({
“内容类型:application/x-www-form-urlencoded”
})
@POST(“v1/用户/检查状态”)
调用getEmailStatus(@Body String email);
}
Post支票电子邮件可能重复class@ahomphophone,我一直在编辑这个问题。提前谢谢我在17秒内跑得更快:pHi,I;我一直在更改代码并按照您的方式进行操作,但错误仍然发生public void onResponse(Call-Call,Response-Response){CheckEmailData emailDataList=Response.body().getData();Log.d(“数据数量:”,String.valueOf(Response.body().getData());}
Hi,我一直在遵循你的方法,但错误仍然存在。你能在你的问题中发布你的更改吗?