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
相关产品推荐
相关产品推荐

