ConcurrentModificationException mientras iteratoring de forma recursiva

Usman la Victoria:

Yo escribo un fucntion que me va a obtener la lista de subcarpetas en una carpeta determinada usando sus identificadores de carpeta. De alguna manera, estoy terminando con una 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;
    }

Sin embargo, sigo obteniendo un error de ConcurrentModificationException para las líneas:

> while (directChildrenIterator.hasNext()){
> 
>         Long value=directChildrenIterator.next();

Cualquier idea de lo que estoy haciendo mal aquí? Cualquier ayuda es muy apreciada.

Jason:

Estás creando un iterador de la lista de desea a continuación, va a actualizar esa primera lista dentro del iterador. Esa es la causa de la ConcurrentModificationException.

Una manera de resolver esto, aunque sea barato, es crear una lista separada de desea que se va a añadir.

        List<Long> toAdd = new ArrayList<>();

        while (directChildrenIterator.hasNext()){
            Long value = directChildrenIterator.next();

            toAdd.addall(getChildrenFolders(value));
        }
        directChildren.addAll(toAdd);

        return directChildren;

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=277686&siteId=1
Recomendado
Clasificación