android中list在remove()时出现java.lang.IndexOutOfBoundsException异常

本文讨论了在Java代码中使用List遍历并删除元素时遇到的`UnsupportedOperationException`和`IndexOutOfBoundsException`异常。通过分析问题原因,作者提出了修改代码的方法来解决这些问题,并详细解释了相关异常的背景知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我写了这么一段代码

final List<File> files = Arrays.asList(rootFile.listFiles());
for (int i = 0; i < dirFiles.size(); i++) {
    File fileTemp = new File(MboxContext.getInstance().getMboxDir() + dirFiles.get(i).getPath());
        if (files.contains(fileTemp)) {
            files.remove(i);
        }
    }
            

在运行时会抛出

java.lang.UnsupportedOperationException
    at java.util.AbstractList.remove(AbstractList.java:638)
    at com.meituan.mbox.util.FileUtil$3.run(FileUtil.java:364)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:818)
    

这样的异常,经过检查发现,此时的files是List对象,是一个未被实现的interface,因此,我把代码改成了

final List<File> files = new LinkedList<>(Arrays.asList(rootFile.listFiles()));
for (int i = 0; i < dirFiles.size(); i++) {
    File fileTemp = new File(MboxContext.getInstance().getMboxDir() + dirFiles.get(i).getPath());
    if (files.contains(fileTemp)) {
        files.remove(i);
        }
    }
            

这样应该不会有什么问题了吧,再次运行,还是出现立新的异常

java.lang.IndexOutOfBoundsException: Invalid index 4, size is 3
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
    at java.util.ArrayList.remove(ArrayList.java:403)
    at com.meituan.mbox.util.FileUtil$3.run(FileUtil.java:365)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:818)

在这里,查找之后发现,原来for循环在遍历的size已经在初始化循环的时候确定了,在remove之后,List里面的数量变化了,但是for循环依旧会按照最开始的数值遍历,所以,需要在remove之后手动对size和i进行减操作

因此,正确的代码应该是

 final List<File> files = new LinkedList<>(Arrays.asList(rootFile.listFiles()));
 int size = files.size();
 for (int i = 0; i < size; i++) {
    File fileTemp = new File(MboxContext.getInstance().getMboxDir() + dirFiles.get(i).getPath());
    if (files.contains(fileTemp)) {
       files.remove(i);
       size--;
       i--;
    }
 }

转载于:https://www.cnblogs.com/cwr941012/p/5029105.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值