You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决树操作中ArrayList迭代出现的Unknown Source并发修改异常

彻底解决ConcurrentModificationException的方案

这个异常我太熟悉了——根源完全在于你复用了类级别的全局ArrayList实例(比如childrenList、descendantList),导致在迭代集合的同时,集合的结构被其他调用修改,触发了Java集合的「快速失败」机制。

问题本质拆解

你用增强for循环遍历children(p)返回的列表时,迭代器会维护一个modCount(集合修改次数)和expectedModCount(预期修改次数)的校验。当递归调用heightOf(child)时,又会调用children(child),这时候你会清空并修改同一个全局childrenList,导致外层迭代器的modCount和expectedModCount不一致,直接抛出checkForComodification异常。之前把removeAll换成clear没用,是因为本质还是在操作同一个全局列表,只是清空方式变了而已。

具体修复方案

核心原则:不要用全局List存储临时结果,每次方法调用都创建独立的局部List,或者把结果列表作为参数传递,保证每个调用上下文的列表互不干扰。

1. 修复children方法(最关键)

把全局的childrenList换成方法内的局部列表,每次调用都创建新实例:

public List<Position<E>> children(Position<E> p) throws InvalidPositionException {
    if(p == null || isEmpty()) throw new InvalidPositionException();
    BinaryTreeNode<E> node = (BinaryTreeNode<E>) p;
    // 每次调用都创建新的ArrayList,彻底避免复用冲突
    List<Position<E>> childrenList = new ArrayList<>();
    if(node.leftChild != null) childrenList.add(node.leftChild);
    if(node.rightChild != null) childrenList.add(node.rightChild);
    return childrenList;
}

2. 修复descendants相关方法

同样去掉全局的descendantList,改为传递局部列表作为参数:

public List<Position<E>> descendants(Position<E> p) throws InvalidPositionException {
    if(p == null || isEmpty()) throw new InvalidPositionException();
    // 每次调用初始化新的结果列表
    List<Position<E>> descendantList = new ArrayList<>();
    descendantsList(p, descendantList);
    return descendantList;
}

// 重载为私有辅助方法,把结果列表作为参数传递
private void descendantsList(Position<E> p, List<Position<E>> descendantList) {
    if(isInternal(p)) {
        for(Position<E> child : children(p)) {
            descendantList.add(child);
            if(isInternal(child)) {
                descendantsList(child, descendantList);
            }
        }
    }
}

3. height方法自动恢复正常

因为heightOf方法依赖children(p),现在children方法每次返回独立的列表,递归调用时外层迭代器遍历的列表不会被内层修改,异常自然消失,不需要额外修改height相关代码。

总结

这种异常的核心就是集合迭代和修改的并发冲突(这里是递归导致的「伪并发」冲突),只要保证每次迭代的集合实例是独立的,不被其他代码修改,就能彻底解决问题。

内容的提问来源于stack exchange,提问作者PeterParker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:30:25