遍历含自定义Parcelable对象的LinkedHashSet并删除元素时仅处理最后一项的问题
问题分析与修复方案
你的代码之所以只处理最后一项,核心问题是在循环里连续调用了两次itr.next(),这会让迭代器每次跳过一个元素,还会引发潜在的异常,具体来说:
每次调用itr.next()都会让迭代器指向集合的下一个元素。你第一次调用它拿到元素去删除对应文件,第二次调用又拿到下一个元素去执行集合的remove()操作——这会导致:
- 一半的元素被跳过,根本没处理
- 直接调用
imgList.remove()会触发ConcurrentModificationException(因为集合在迭代过程中被直接修改) - 当迭代器走到最后一个元素时,第二次调用
itr.next()会抛出NoSuchElementException
修复后的代码
Iterator<ImageList> itr = imgList.iterator(); while(itr.hasNext()) { // 只调用一次next(),把当前元素存下来 ImageList currentImage = itr.next(); File file = this.getFileStreamPath(currentImage.getImgName()); // 先判断文件是否存在,避免删除不存在的文件时出现错误 if (file.exists()) { file.delete(); } // 使用迭代器的remove()方法,安全移除当前遍历到的元素 itr.remove(); }
关键改进点
- 仅调用一次
itr.next():确保每次循环处理的是同一个元素,不会出现跳项的情况 - 使用迭代器的
remove():迭代器自身的remove方法会同步更新集合状态,不会触发并发修改异常 - 添加文件存在判断:避免尝试删除不存在的文件时产生不必要的错误
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

