【问题标题】:NullPointerException using Retrofit responseNullPointerException 使用改造响应
【发布时间】:2018-09-20 09:04:35
【问题描述】:

我正在使用 Retrofit 与 Android 上的 REST API 进行通信,但我 得到如下所示的 NullPointerException。我尝试使用邮递员, API 工作正常,我得到登录正常工作的响应。

错误

进程:com.example.krish.webdemo,PID:3064 java.lang.NullPointerException 在 com.example.krish.webdemo.activities.LoginActivity$2.onResponse

 Call<LoginResponse> call = RetrofitClient
                .getInstance()
                .getApi()
                .userLogin(email, password);

        call.enqueue(new Callback<LoginResponse>() {
            @Override
            public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
                LoginResponse loginResponse = response.body();
                if (!loginResponse.isError()) {
                    Toast.makeText(LoginActivity.this, loginResponse.getMessage(), Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(LoginActivity.this, loginResponse.getMessage(), Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onFailure(Call<LoginResponse> call, Throwable t) {

            }
        });
    }

我的登录响应中有一个NullPointerException,'.isError()' 是 显示空错误

API 接口

@FormUrlEncoded
    @POST("userlogin")
    Call<LoginResponse> userLogin(
            @Field("email") String email,
            @Field("password") String password
    );

改造实例

private static final String BASE_URL ="http://192.168.1.38/KrishApi/public/";
    private static RetrofitClient mInstance;
    private Retrofit retrofit;

    private RetrofitClient() {


        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    public static synchronized RetrofitClient getInstance() {
        if (mInstance == null) {
            mInstance = new RetrofitClient();
        }
        return mInstance;
    }
    public Api getApi(){
        return retrofit.create(Api.class);
    }

JSON 响应

{
    "error": false,
    "message": "Login Successful",
    "user": {
        "id": 3,
        "email": "pandi@gmail.com",
        "name": "pandi",
        "age": "22",
        "college": "sec"
    }
}

POJO 类

public class LoginResponse {


    private boolean error;
    private String message;
    private User user;

    public LoginResponse(boolean error, String message, User user) {
        this.error = error;
        this.message = message;
        this.user = user;
    }

    public boolean isError() {
        return error;
    }

    public String getMessage() {
        return message;
    }

    public User getUser() {
        return user;
    }
}

【问题讨论】:

    标签: android retrofit2 android-developer-api


    【解决方案1】:

    response.body() 如果响应不成功,则返回 null。因此,您必须始终在 onResponse 方法中检查响应是否成功。

        @Override
        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
    
            if (response.isSuccessful()){
                LoginResponse loginResponse = response.body();
    
                if (!loginResponse.isError()) {
                    Toast.makeText(LoginActivity.this, loginResponse.getMessage(), Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(LoginActivity.this, loginResponse.getMessage(), Toast.LENGTH_LONG).show();
                }
    
            } else{
                 ResponseBody errorBody = response.errorBody();
                 // check error.
            }
        }
    

    【讨论】:

      【解决方案2】:
      "error": false,
      

      当应用程序尝试使用 具有 null 值的对象引用。

      您应该检查您的回复 isSuccess()

      /** {@code true} 如果 {@link #code()} 在 [200..300) 范围内。 */
      公共布尔isSuccess(){ 返回 rawResponse.isSuccessful(); }

                    if (response.isSuccess()) //isSuccessful()
                      {
                         LoginResponse loginResponse = response.body();
                          ////
                      }
      

      【讨论】:

      • @krishna 你应该使用Boolean
      • 我正在使用布尔变量
      • 方法调用'isError'可能产生java.lang.NullPointerException
      • @krishna 一个草率的错误让你付出了代价。再次调试您的代码。
      • 响应{protocol=http/1.1, code=404, message=Not Found, url=192.168.1.38/MyApi/public/userlogin}
      猜你喜欢
      • 2020-06-02
      • 2015-10-24
      • 2015-07-18
      • 1970-01-01
      • 2019-03-14
      • 2018-05-16
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      相关资源
      最近更新 更多