zoukankan      html  css  js  c++  java
  • 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--;
        }
     }
  • 相关阅读:
    do while 后面要加分号,你大爷的
    ATS push cache 测试
    ATS (apache traffic server) http_ui 设置与使用
    chrome 开发者工具使用一例
    beautiful soup 遇到class标签的值中含有空格的处理
    virtualbox sharefolder mount fail
    从wait角度调优
    Service Broker入门
    数据库建立初步
    只读账号设置-db_datareader
  • 原文地址:https://www.cnblogs.com/cwr941012/p/5029105.html
Copyright © 2011-2022 走看看