首页 > 解决方案 > 尝试在空对象引用上调用虚拟方法“java.lang.String com.nabil.myapplication.model.Gregorian.getDate()”

问题描述

尝试通过使用改造 2 和 gson 的库来获取 api 数据,我能够根据我创建的模型变量获取数据,但是在我得到的一个模型中是空点异常。我检查了每个变量是否在构造函数、getter、setter 中初始化,但一切都很好。在调试中,它在 Date.java 的模型中显示为空。下面是 java 代码和 LOGCAT。希望有人帮助我找到解决方案。

MainActivity.java

public class MainActivity extends AppCompatActivity {
    TextView fajrTv,dhuhrTv,asrTv,maghribTv,ishaTv,dateTv;
    Button btnSearch;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_prayer);
        btnSearch=findViewById(R.id.btnSearch);
        fajrTv=findViewById(R.id.fajrTv);
        dhuhrTv=findViewById(R.id.dhuhrTv);
        asrTv=findViewById(R.id.asrTv);
        maghribTv=findViewById(R.id.maghribTv);
        ishaTv=findViewById(R.id.ishaTv);
        dateTv=findViewById(R.id.dateTv);
btnSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SearchAPI();
            }
        });
    private void SearchAPI() {
        String mLocation=search.getText().toString().trim();
        keyboard();
        if (mLocation.isEmpty()){
            Toast.makeText(PrayerActivity.this,"Please enter city name",Toast.LENGTH_SHORT).show();
        }else {
            Retrofit retrofit=new Retrofit.Builder()
                    .baseUrl(APIInterface.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            APIInterface apiInterface=retrofit.create(APIInterface.class);
            Call<Prayer> call=apiInterface.getPrayer(mLocation,method,school);
            call.enqueue(new Callback<Prayer>() {
                @RequiresApi(api = Build.VERSION_CODES.O)
                @Override
                public void onResponse(Call<Prayer> call, Response<Prayer> response) {
                    Prayer prayer=response.body();
                    String fajrMain=prayer.getData().getTimings().getFajr();
                    String dhuhrMain=prayer.getData().getTimings().getDhuhr();
                    String asrMain=prayer.getData().getTimings().getAsr();
                    String maghribMain=prayer.getData().getTimings().getMaghrib();
                    String ishaMain=prayer.getData().getTimings().getIsha();
                    String dateMain=prayer.getData().getDate().getGregorian().getDate(); //In logcat it is showing me null on this line
                    dateTv.setText(dateMain);}
                @Override
                public void onFailure(Call<Prayer> call, Throwable t) {
                    Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_LONG).show();}});}}}}

API接口.Java

public interface APIInterface {
    String BASE_URL="https://api.aladhan.com/v1/"; //For checking the json use "http://api.aladhan.com/v1/timingsByAddress?address=Riyadh&method=1"
    @GET("/timingsByAddress?address=&method=&school=")
    Call<Prayer> getPrayer(@Query("address") String address, @Query("method") int method, @Query("school") int school);}

数据.Java

public class Data {
    @SerializedName("timings")
    @Expose
    private Timings timings;
    @SerializedName("date")
    @Expose
    private Date date;
    @SerializedName("meta")
    @Expose
    private Meta meta;
    public Data(Timings timings, Date date, Meta meta) {
        this.timings = timings;
        this.date = date;
        this.meta = meta;}
    public Timings getTimings() {
        return timings;}
    public Date getDate(){
        return date;}
    public Meta getMeta() {
        return meta;}
    public void setTimings(Timings timings) {
        this.timings = timings;}
    public void setDate(Date date) {
        this.date = date;}
    public void setMeta(Meta meta) {
        this.meta = meta;}}

日期.Java

public class Date {

@SerializedName("readable")
@Expose
private String readable;
@SerializedName("timestamp")
@Expose
private String timestamp;
@SerializedName("hijri")
@Expose
private Hijri hijri;
@SerializedName("gregorian")
@Expose
private Gregorian gregorian;
public Date(String readable, String timestamp,Hijri hijri, Gregorian gregorian) {
    this.readable = readable;
    this.timestamp=timestamp;
    this.hijri=hijri;
    this.gregorian = gregorian;}
public String getReadable() {
    return readable;}
public void setReadable(String readable) {
    this.readable = readable;}
public Gregorian getGregorian() {
    return gregorian;}//During debugging it is showing getGregorian "null" on this line
public Hijri getHijri() {
    return hijri;}
public void setHijri(Hijri hijri) {
    this.hijri = hijri;}
public String getTimestamp() {
    return timestamp;}
public void setTimestamp(String timestamp) {
    this.timestamp = timestamp;}
public void setGregorian(Gregorian gregorian) {
    this.gregorian = gregorian;}}

公历Java

public class Gregorian {
    @SerializedName("date")
    @Expose
    private String date;
    public Gregorian(String date) {
        this.date = date;}
    public String getDate() {
        return date;}
    public void setDate(String date) {
        this.date = date;}}

LOGCAT

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nabil.myapplication, PID: 8752
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.nabil.myapplication.model.Gregorian.getDate()' on a null object reference
        at com.nabil.myapplication.PrayerActivity$5.onResponse(MainActivity.java:167)

标签: javaandroidandroid-studiogsonretrofit2

解决方案


推荐阅读