复制树结构时的java.util.ConcurrentModificationException

时间:2014-08-14 15:38:10

标签: java exception recursion

我想将树结构(源)复制到另一个(目标),但是当我执行下面的方法时,我得到了java.util.ConcurrentModificationException:

private void mergeNode(TreeLayoutNode source, TreeLayoutNode target){

    List<TreeLayoutNode> children = source.getChildren();

    if(CollectionUtils.isEmpty(children)){
        return;
    }

    Iterator<TreeLayoutNode> it = children.iterator();
    while(it.hasNext()){
        **TreeLayoutNode child = it.next();**
        TreeLayoutNode copy = new TreeLayoutNode();
        copy.setName(child.getName());
        copy.setCapacity(child.getCapacity());
        copy.setParent(child.getParent());
        copy.setChildren(child.getChildren());
        copy.setProportions(child.getProportions());
        target.addChildNode(copy);
        mergeNode(child, copy);
    }
}

以“**”开头的代码是发生异常的地方。任何人都可以提供任何提示吗?

1 个答案:

答案 0 :(得分:1)

删除对'copy.setChildren(child.getChildren())'的调用。这导致引用源树中的子项被添加到目标树,这不是您想要的。递归方法调用将处理孩子的填充。

此外,您需要将新节点的父节点设置为新树中的正确节点,而不是调用'copy.setParent(child.getParent())',它将父节点引用设置为旧树中的节点。调用应该是'copy.setParent(target)'。