You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中使用Volley库加载JSON接口数据到RecyclerView的空指针错误如何解决

问题修复方案

根因定位

错误日志指向MainAdapter.getItemCount方法空指针,原因是你初始化MainAdapter时传入的dataArrayList还未实例化,默认值为null,RecyclerView首次渲染调用size()方法时触发崩溃。

需要修改的点:

1. 调整test Activity中变量初始化顺序

修改onCreate方法,先实例化dataArrayList再创建Adapter,避免给Adapter传空集合:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    recyclerView = findViewById(R.id.recycler_view);
    // 先初始化集合
    dataArrayList = new ArrayList<>();
    requestQueue = Volley.newRequestQueue(this);
    // 再创建Adapter
    adapter = new MainAdapter(dataArrayList,test.this);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);

    parseJson();
}

2. 修正JSON解析逻辑

  • 循环条件错误:你当前用response.length()控制循环,应该改为用ayah数组的长度ayah.length(),避免数组越界
  • 不要在循环内重复创建Adapter、重复设置Adapter,全量数据解析完成后统一刷新列表即可
  • 修正MainData传参顺序:MainData构造函数参数顺序是(arabic, english, translation),你之前传参顺序颠倒,会导致内容显示错位
@Override
public void onResponse(JSONObject response) {
    try {
        JSONObject data = response.getJSONObject("data");
        JSONArray ayah = data.getJSONArray("ayahs");
        // 清空旧数据,避免多次请求重复添加
        dataArrayList.clear();
        // 循环条件改成ayah数组长度
        for (int i = 0; i < ayah.length(); i++){
            JSONObject ayahs = ayah.getJSONObject(i);
            JSONObject text = ayahs.getJSONObject("text");
            JSONObject translation = ayahs.getJSONObject("translation");

            String arabic = text.getString("ar");
            String english = text.getString("read");
            String trans = translation.getString("read");
            // 修正传参顺序,和构造函数对应
            dataArrayList.add(new MainData(arabic, english, trans));
        }
        // 所有数据解析完成后,通知Adapter刷新
        adapter.notifyDataSetChanged();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

3. 给Adapter加空判断防护

修改MainAdapter的getItemCount方法,增加空判断避免后续再出现同类空指针:

@Override
public int getItemCount() {
    // 集合为空返回0,否则返回实际长度
    return dataArrayList == null ? 0 : dataArrayList.size();
}

修改完成后重新运行即可解决崩溃问题,列表会正常加载接口返回的内容。

内容的提问来源于stack exchange,提问作者Abdul Hadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:06:03