JSON 对象返回 null 对象引用

json object returning null object reference

提问人:Ukeme Elijah 提问时间:9/21/2022 最后编辑:Malik SaifullahUkeme Elijah 更新时间:9/22/2022 访问量:504

问:

我正在使用我用 Java Spring boot 开发的端点来开发一个 Android 应用程序,当我尝试注册用户时,响应一直返回 null。我在 swagger 中使用了相同的端点,它正在工作,但不知道为什么它在 android studio 中不起作用。我不知道为什么它总是返回null。这是来自 logcat 的错误。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.elijah.ukeme.doctorsappointmentapplication, PID: 18696
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
        at com.elijah.ukeme.doctorsappointmentapplication.activities.PatientRegistrationActivity$2.onResponse(PatientRegistrationActivity.java:215)
        at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

这是我的api,我在android studio中将localhost更改为我的系统ip地址localhost:8080/patient/signUp

这些是必需的参数

private String name;
    private String email;
    private String password;
    private String gender;
    private String profileImage;
    @JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd")
    private LocalDate dateOfBirth;

我的模型类

public class SignUpPatienceDto {

    @SerializedName("name")
    private String name;
    @SerializedName("email")
    private String email;
    @SerializedName("password")
    private String password;
    @SerializedName("gender")
    private String gender;
    @SerializedName("profileImage")
    private String profileImage;
    @SerializedName("dateOfBirth")
    private LocalDate dateOfBirth;

    public String getGender() {
        return gender;
    }

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



    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

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

    public String getPassword() {
        return password;
    }

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

    public String getProfileImage() {
        return profileImage;
    }

    public void setProfileImage(String profileImage) {
        this.profileImage = profileImage;
    }

    public LocalDate getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(LocalDate dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    public SignUpPatienceDto() {
    }
}

基 Url 类

public class BaseUrlClient {

    private static final String BASE_URL = "http://192.168.43.5:8080";

    private static BaseUrlClient mInstance;
    private Retrofit retrofit;

    private BaseUrlClient(){
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    public static synchronized BaseUrlClient getInstance(){
        if (mInstance ==null){
            mInstance = new BaseUrlClient();
        }
        return mInstance;
    }
    public ApiClient getApi(){
        return retrofit.create(ApiClient.class);
    }
}

我的 ApiClient 类

public interface ApiClient {


    @POST("/patient/signUp")
    Call<ResponseBody> createPatient(@Body SignUpPatienceDto signUpPatienceDto);

    @POST("/appointment/book")
    Call<ApiResponse> bookAppointment(@Body AppointmentBookingDto appointmentBookingDto, @Field("token") String token);

}

这是我调用该方法的活动

 @RequiresApi(api = Build.VERSION_CODES.O)
    public void createPatient() {
        loadingPB.setVisibility(View.VISIBLE);
        int selectedID = radioGroup.getCheckedRadioButtonId();
        male = (RadioButton) findViewById(selectedID);
        female = (RadioButton) findViewById(selectedID);
        if (male.isChecked()) {
            selectedGender = male.getText().toString();
        } else if (female.isChecked()) {
            selectedGender = female.getText().toString();
        } else {
            selectedGender = "Not specify";
        }
        date = btnDateOfBirth.getText().toString();
        SignUpPatienceDto signUpPatienceDto = new SignUpPatienceDto();
        signUpPatienceDto.setDateOfBirth(LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy/MM/dd")));
        signUpPatienceDto.setEmail(email.getText().toString());
        signUpPatienceDto.setName(name.getText().toString());
        signUpPatienceDto.setPassword(password.getText().toString());
        signUpPatienceDto.setProfileImage("Profile image not available yet");
        signUpPatienceDto.setGender(selectedGender);

        Call<ResponseBody> call = BaseUrlClient
                .getInstance().getApi().createPatient(signUpPatienceDto);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                Toast.makeText(PatientRegistrationActivity.this, response.message(), Toast.LENGTH_SHORT).show();
                Log.d("Main",response.body().toString());

            }

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

                Log.d("Main",t.getMessage());
            }
        });

    }

我不知道为什么当我尝试获取响应时它总是返回空引用,但相同的 api 端点在邮递员和 swagger 中都工作正常。

java android retrofit2 nullreferenceexception

评论


答:

0赞 ahjo4321hsotuhsa 9/21/2022 #1

您的日志显示第 215 行的 PatientRegistrationActivity 中存在错误。 在这里,您正在尝试将 null 转换为 String。在解析值之前,应进行 null 检查。使用调试器或日志确认这一点

评论

0赞 Ukeme Elijah 9/21/2022
端点以反斜杠开头,所以我认为它仍然是一样的?
0赞 Ukeme Elijah 9/21/2022
我已经尝试过了,但它仍然给我同样的错误,我认为问题出在我的 ApiClient 类中的 post 方法。也许它需要某种格式
0赞 Ukeme Elijah 9/21/2022
这就是我使用大摇大摆时响应标头的显示方式。我不知道我是否需要将其包含在 ApiClient 类中。 连接:保持活动 内容类型:application/json 日期:2022 年 9 月 21 日星期三 04:52:02 GMT 保持活动状态:超时=60 传输编码:分块 变化:来源、访问控制请求方法、访问控制请求标头