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是空实现,请求失败时没有做兜底处理,也会增加异常出现概率。
修复方案
- 避免
photos被置空,不要直接重写photos的对象指向,改用addAll的方式更新数据,修改onResponse中的逻辑:
@Override public void onResponse(JSONObject response) { List<Photo> tempList = PhotoJsonUtils.extractPhotos(response); photos.clear(); if (tempList != null) { photos.addAll(tempList); } // 数据加载完成后再开放游戏相关交互逻辑 }
- 给
PhotoJsonUtils.extractPhotos方法添加兜底逻辑,确保无论解析是否成功,永远返回非空的List对象,解析失败时返回空的ArrayList即可,不要返回null。 - 在
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); } }
- 补全
onErrorResponse的错误处理逻辑,请求失败时给用户提示,同时可以触发重试逻辑,避免无响应。 - 补充等待逻辑:网络请求未完成时,禁用游戏相关点击交互,避免用户提前触发图片加载逻辑。
内容的提问来源于stack exchange,提问作者Era Kuqi
相关产品推荐
相关产品推荐

