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

Android Studio报List.get(int)空指针异常,记忆游戏无法加载图片

空指针异常原因

  • 核心原因是photos列表对象被赋值为null后,调用了List.get()方法:你的代码中虽然初始化时给photos赋值了非空的ArrayList,但在Volley请求的onResponse回调中,直接通过photos = PhotoJsonUtils.extractPhotos(response)重写了photos的指向,一旦PhotoJsonUtils.extractPhotos解析JSON失败返回null,photos就会变成null,后续调用photos.get()就会触发该空指针。
  • 次要关联原因:Volley是异步网络请求,若请求还未完成、回调还没触发时就调用了showImage方法,若此时photos已经被其他逻辑置空也会触发报错;另外你当前的onErrorResponse是空实现,请求失败时没有做兜底处理,也会增加异常出现概率。

修复方案

  1. 避免photos被置空,不要直接重写photos的对象指向,改用addAll的方式更新数据,修改onResponse中的逻辑:
@Override
public void onResponse(JSONObject response) {
    List<Photo> tempList = PhotoJsonUtils.extractPhotos(response);
    photos.clear();
    if (tempList != null) {
        photos.addAll(tempList);
    }
    // 数据加载完成后再开放游戏相关交互逻辑
}
  1. 给PhotoJsonUtils.extractPhotos方法添加兜底逻辑,确保无论解析是否成功,永远返回非空的List对象,解析失败时返回空的ArrayList即可,不要返回null。
  2. 在showImage方法中添加前置校验,避免索引越界或空指针:
private void showImage(ImageView img, int card) {
    // 先校验photos状态,你当前用到了0、1、2三个索引,最少要校验长度>=3
    if (photos == null || photos.size() < 3) {
        // 加载默认占位图,避免崩溃
        Picasso.with(this).load(R.drawable.default_placeholder).into(img);
        return;
    }
    if (cardsArray[card] == 101) {
        Picasso.with(this).load(photos.get(0).getImgUrl()).into(img);
    } else if (cardsArray[card] == 102) {
        Picasso.with(this).load(photos.get(1).getImgUrl()).into(img);
    } else if (cardsArray[card] == 103) {
        Picasso.with(this).load(photos.get(2).getImgUrl()).into(img);
    }
}
  1. 补全onErrorResponse的错误处理逻辑,请求失败时给用户提示,同时可以触发重试逻辑,避免无响应。
  2. 补充等待逻辑:网络请求未完成时,禁用游戏相关点击交互,避免用户提前触发图片加载逻辑。

内容的提问来源于stack exchange,提问作者Era Kuqi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:54:03