【问题标题】:Why is retrofit response list null?为什么改造响应列表为空?
【发布时间】:2019-09-18 18:57:12
【问题描述】:

我正在开发一个使用 Retrofit 进行 API 调用的 android 应用程序。我正在尝试从一个名为“reception”的表中获取记录,该表只有一列rClose。 API 调用在 POSTMAN 测试中响应良好。但是,当我在我的片段代码中处理响应以获取 closeList 的响应长度(大小)时,代码运行时没有错误,但应用程序在运行时崩溃,我收到以下错误:

java.lang.NullPointerException:尝试在空对象引用上调用接口方法“int java.util.List.size()”

这是我的代码:

public class CustomerHomeFragment extends Fragment{

    private List<Close> closeList;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_home_customer, container, false);
    }


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Call<CloseResponse> call = RetrofitClient.getInstance().getApi().getCloses();

        call.enqueue(new Callback<CloseResponse>() {
            @Override
            public void onResponse(Call<CloseResponse> call, Response<CloseResponse> response) {

                closeList = response.body().getCloses();


                int count = closeList.size();
                if(count < 1){
                    showFoodsInRecyclerView();
                }else{


                }

            }

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

            }
        });



    }

}

Api.java

  @GET("allclose")
    Call<CloseResponse> getCloses();

关闭.java

public class Close {

    private String rClose;

    public Close(String rClose) {
        this.rClose = rClose;

    }


    public String getRClose() {
        return rClose;
    }

}

CloseResponse.java

public class CloseResponse {

    private boolean error;
    private List<Close> closes;

    public CloseResponse(boolean error, List<Close> closes) {
        this.error = error;
        this.closes = closes;
    }

    public boolean isError() {
        return error;
    }

    public List<Close> getCloses() {
        return closes;
    }
}

Logcat:

2019-08-24 19:14:11.817 3718-3718/com.nikappzaar.app.foodtakeout E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nikappzaar.app.foodtakeout, PID: 3718
    java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
        at com.nikappzaar.app.foodtakeout.fragments.CustomerHomeFragment$1.onResponse(CustomerHomeFragment.java:77)
        at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

错误在以下代码行:

int count = closeList.size();

我对@9​​87654330@ 做了一些研究,但我不知道为什么响应列表是“null”,而我的数据库的其他表上的相同方法运行良好!我做错了什么?

我们将不胜感激。

【问题讨论】:

  • 请在此处发布您的 logcat。
  • edit您的问题与该信息。还请告诉我们是哪一行导致错误。
  • 首先,您应该在 onResponse 中添加此代码: if (response.isSuccessful()) {.......}......然后 if( response.body()!=null){.......}
  • 您是否在改造客户端构建器中添加了 addConverterFactory(GsonConverterFactory.create())?
  • 我对我的其他表格进行了上述操作,得到了很好的响应,并在 recyclerviews 中显示了列表。但我不知道为什么它在这里不起作用。

标签: java android list retrofit


【解决方案1】:

您需要在此片段 CustomerHomeFragment 中使用 new 初始化 List。 更改此行 private List closeList;和 私有列表 closeList = new ArrayList(); 它会解决你的错误。

【讨论】:

  • 这并不能阻止response.body().getCloses() 可能为空
  • 您是否尝试过调试您的应用程序?您是否在 closeList 中获取数据。
  • 这不是我的应用程序。我只是说初始化字段不会修复显示的堆栈跟踪
  • @cricket_007 是对的。这不能解决问题。我认为问题在于我没有在 closeList 中获取数据。
猜你喜欢
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
相关资源
最近更新 更多