首页 文章

Retrofit:java.lang.NullPointerException:尝试调用虚方法'java.lang.String com.retrofitd.rest.LoginModel$Data.getFirstName()'

提问于
浏览
0

我正在尝试在我的应用程序中实现Retrofit . 低于错误:

java.lang.NullPointerException: 
Attempt to invoke virtual method 'java.lang.String com.retrofitd.rest.LoginModel$Data.getFirstName()' on a null object reference
                                                                 at com.retrofitd.MainActivity$1$1.onResponse(MainActivity.java:46)
                                                                 at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
                                                                 at android.os.Handler.handleCallback(Handler.java:742)
                                                                 at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                 at android.os.Looper.loop(Looper.java:154)
                                                                 at android.app.ActivityThread.main(ActivityThread.java:5527)
                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)

我的 API CLIENT 课程如下:

public class ApiClient {

    public static final String BASE_URL = "http://999.99.999.99/~test/master/api/";
    private static Retrofit retrofit = null;


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

API INTERFACE 如下:

public interface ApiInterface {//    gym/gymdetail
    @POST("webservice/login")
    Call<LoginModel> getGymDetails(@Query("username") String userId,@Query("password")String strGymId);
}

以下 MainActivity.java ,使用如下:

ApiInterface apiService =
                    ApiClient.getClient().create(ApiInterface.class);

            Call<LoginModel> call = apiService.getGymDetails("sssss", "123456");
            call.enqueue(new Callback<LoginModel>() {
                @Override
                public void onResponse(Call<LoginModel> call, Response<LoginModel> response) {

                    Toast.makeText(MainActivity.this, "" + response.body().getData().getFirstName(), Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFailure(Call<LoginModel> call, Throwable t) {
                    Toast.makeText(MainActivity.this, "Failure", Toast.LENGTH_SHORT).show();
                }
            });
        }

还在清单中设置Internet权限 . 可能是什么问题?谢谢 .

EDIT 让我添加我的模型类 . 我的登录模型类如下 . 请检查一下 . 我的模特课:

public class LoginModel {

@SerializedName("status")
@Expose
private Integer status;
@SerializedName("data")
@Expose
private Data data;
@SerializedName("message")
@Expose
private String message;

public Integer getStatus() {
    return status;
}

public void setStatus(Integer status) {
    this.status = status;
}

public Data getData() {
    return data;
}

public void setData(Data data) {
    this.data = data;
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

public class Data {

    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("first_name")
    @Expose
    private String first_name;
    @SerializedName("last_name")
    @Expose
    private String last_name;
    @SerializedName("email")
    @Expose
    private String email;
    @SerializedName("username")
    @Expose
    private String username;
    @SerializedName("password")
    @Expose
    private String password;
    @SerializedName("photo")
    @Expose
    private String photo;
    @SerializedName("birthdate")
    @Expose
    private String birthdate;
    @SerializedName("gender")
    @Expose
    private String gender;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return first_name;
    }

    public void setFirstName(String first_name) {
        this.first_name = first_name;
    }

    public String getLastName() {
        return last_name;
    }

    public void setLastName(String last_name) {
        this.last_name = last_name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }

    public String getBirthdate() {
        return birthdate;
    }

    public void setBirthdate(String birthdate) {
        this.birthdate = birthdate;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

}

}

3 回答

  • 0

    首先使用postman检查pesponse,如果它正常工作,那么你可以使用json schema来构建pojo,使用json schema to pojo . 在发送请求时你必须通过那个pojo类,你的问题将会解决

  • 0

    可能有很多原因 .

    1)您定义的模型类与来自请求的json不匹配

    2)你使用错误的方法,例如发布或获取?

    但是我看到你的模型类中有一个问题可以在这里发布,以便可以查看它?

  • 0

    像这样创建一个jsonobject并将其发布到正文中

    JSONObject jsonObject=new JSONObject();
        try {
            jsonObject.put("username","Ssss");
            jsonObject.put("password","Sdsd");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    

    并改变这样的api接口调用

    Call<LoginModel> call = apiService.getGymDetails(jsonObject);
    

    像这样改变界面

    public interface ApiInterface {
    @POST("webservice/login")
    @Headers("Content-Type: application/json")
    Call<LoginModel> getGymDetails(@Body JSONObject jsonObject);
    }
    

相关问题