我在java迭代器中的代码有什么问题

Bob*_*obs 4 java iterator file

我正在写一个文件浏览器

ArrayList<File> folders = new ArrayList<File>(Arrays.asList(parent
                .listFiles(filter)));

ListIterator<File> it = folders.listIterator();

        while (it.hasNext()) {

            File file = it.next();

            if (file.isDirectory())
            {
                ArrayList<File> subFolders = new ArrayList<File>(
                        Arrays.asList(file
                                .listFiles(filter)));
                for (File sub : subFolders) {
                    it.add(sub);
                }
            }
            else
            {
                mediaFiles.add(file);
            }

            it.remove();

        }
Run Code Online (Sandbox Code Playgroud)

当代码到达时it.remove();我得到以下错误:

02-04 23:32:47.670: E/AndroidRuntime(20230):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-04 23:32:47.670: E/AndroidRuntime(20230):    at dalvik.system.NativeStart.main(Native Method)
02-04 23:32:47.670: E/AndroidRuntime(20230): Caused by: java.util.ConcurrentModificationException
02-04 23:32:47.670: E/AndroidRuntime(20230):    at java.util.AbstractList$SimpleListIterator.remove(AbstractList.java:71)
Run Code Online (Sandbox Code Playgroud)

cha*_*cea 9

引用删除的文档:

从列表中删除next()或previous()(可选操作)返回的最后一个元素.此呼叫只能在每次呼叫下一次或上一次时进行一次.只有在最后一次调用next或previous之后没有调用add(E)时才能进行此操作.

有关删除方法的文档中引用的其他信息:

请注意,remove()和set(Object)方法没有根据光标位置定义; 它们被定义为对next()或previous()调用返回的最后一个元素进行操作.

因此,如果您add(E)在迭代中调用,则remove()也无法调用.

我会把remove()方法放在else声明中:

else
{
    mediaFiles.add(file);
    it.remove();
}
Run Code Online (Sandbox Code Playgroud)

这样你打电话就不会打电话 add(E)

但是,remove方法是可选的,因为您可以在不调用的next()情况下不断调用该方法remove().所以你可以完全省略它,这可能是你想要的结果.