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

我写了这么一段代码

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