Java 使用改装从REST获取响应时使用空指针

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

我正在使用改型与Android上的RESTAPI通信,但我得到一个错误NullPointerException,如下所示。我尝试使用postman,API工作正常,我得到了响应

java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“java.util.List ukmutilizer.project.com.ukm_utilizer.model.CheckEmail.getData()”

这是我的活动课

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,我一直在遵循你的方法,但错误仍然存在。你能在你的问题中发布你的更改吗?