Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归迭代时的ConcurrentModificationException_Java_Android_Data Structures - Fatal编程技术网

Java 递归迭代时的ConcurrentModificationException

Java 递归迭代时的ConcurrentModificationException,java,android,data-structures,Java,Android,Data Structures,我正在写一个函数,它将使用给定文件夹中的子文件夹ID获取子文件夹列表。不知何故,我最终得到了一个java.util.ConcurrentModificationException private List<Long> getChildrenFolders(Long folderId) { List<Long> directChildren=new CopyOnWriteArrayList <>(); Iterator<Fo

我正在写一个函数,它将使用给定文件夹中的子文件夹ID获取子文件夹列表。不知何故,我最终得到了一个java.util.ConcurrentModificationException

private List<Long> getChildrenFolders(Long folderId) {
        List<Long> directChildren=new CopyOnWriteArrayList <>();
        Iterator<Folder> folderList= (Iterator<Folder>) folderMap.values().iterator();

        while (folderList.hasNext()){
            Folder currentFolder=folderList.next();
            Long parentId=currentFolder.getParentId();
            Long currentFolderId=currentFolder.getId();
            if(parentId.equals(folderId)){
                directChildren.add(currentFolderId);
                Folder folder=  actionManager.getFolderById(currentFolderId);
                folder.getParentId();
            }
        }

        CopyOnWriteArrayList<Long> copy= new CopyOnWriteArrayList<Long>(directChildren);

        Iterator<Long> directChildrenIterator = copy.iterator();

        while (directChildrenIterator.hasNext()){
            Long value=directChildrenIterator.next();
           directChildren.addall(getChildrenFolders(value));
        }
        return directChildren;
    }

关于我做错了什么有线索吗?非常感谢您的帮助。

您正在从长列表创建迭代器,然后在迭代器中更新第一个列表。这就是ConcurrentModificationException的原因

private List<Long> getChildrenFolders(Long folderId) {
        List<Long> directChildren=new CopyOnWriteArrayList <>();
        Iterator<Folder> folderList= (Iterator<Folder>) folderMap.values().iterator();

        while (folderList.hasNext()){
            Folder currentFolder=folderList.next();
            Long parentId=currentFolder.getParentId();
            Long currentFolderId=currentFolder.getId();
            if(parentId.equals(folderId)){
                directChildren.add(currentFolderId);
                Folder folder=  actionManager.getFolderById(currentFolderId);
                folder.getParentId();
            }
        }

        CopyOnWriteArrayList<Long> copy= new CopyOnWriteArrayList<Long>(directChildren);

        Iterator<Long> directChildrenIterator = copy.iterator();

        while (directChildrenIterator.hasNext()){
            Long value=directChildrenIterator.next();
           directChildren.addall(getChildrenFolders(value));
        }
        return directChildren;
    }
解决这一问题的一种方法是创建一个单独的多头列表,列出将要添加的多头,尽管成本很低

List toAdd=newarraylist();
while(directChildrenIterator.hasNext()){
Long value=directChildrenIterator.next();
toAdd.addall(getChildrenFolders(value));
}
directChildren.addAll(toAdd);
返回儿童;