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

遍历含自定义Parcelable对象的LinkedHashSet并删除元素时仅处理最后一项的问题

问题分析与修复方案

你的代码之所以只处理最后一项,核心问题是在循环里连续调用了两次itr.next(),这会让迭代器每次跳过一个元素,还会引发潜在的异常,具体来说:

每次调用itr.next()都会让迭代器指向集合的下一个元素。你第一次调用它拿到元素去删除对应文件,第二次调用又拿到下一个元素去执行集合的remove()操作——这会导致:

  1. 一半的元素被跳过,根本没处理
  2. 直接调用imgList.remove()会触发ConcurrentModificationException(因为集合在迭代过程中被直接修改)
  3. 当迭代器走到最后一个元素时,第二次调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:39:43