Java 递归迭代时的ConcurrentModificationException
我正在写一个函数,它将使用给定文件夹中的子文件夹ID获取子文件夹列表。不知何故,我最终得到了一个java.util.ConcurrentModificationExceptionJava 递归迭代时的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
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);
返回儿童;