List中remove方法的错误引用分析

在完成Java任务的过程中,遇到了这样的一个问题,我们看下图中的代码示例。

这里我们对edges 进行了for each循环,在这之后我想经过判断,对edges中的对象进行删除,但是编译器在运行时报出了错误

 

报错情况:

 

上面提示的是一个并发修改异常错误

分析之后得出主要原因是我们在删除的时候是通过ArrayList的remove方法去操作的,而我们本身实现的就是一个ArrayList接口,每次修改也都会改变当前的值,而再次进行比较的时候这个list就发生了改变,从而引发了错误。解决的方法是我们可以使用一个迭代器来帮助我们进行实现。

 

Iterator接口的remove方法将会删除上次调用next方法时返回的元素。在大多数情况下,这是有道理的,在决定删除某个元素之前应该先看下这个元素。不过如果想要删除这个指定的元素,仍需要越过这个元素。next方法和remove方法之间的调用存在依赖性。如果调用remove之前没有调用next这将会是不合法的。如果这样做,会抛出一个IllegalStateException异常。

 public boolean remove(L vertex) {
        boolean flag = false;
        if (vertices.contains(vertex)) {
            vertices.remove(vertex);
            flag = true;
        }
    for(Iterator<Edge<L>> edg = edges.iterator();edg.hasNext();) {
        Edge<L> edge = edg.next();
        if(edge.getSource().equals(vertex)||edge.getTarget().equals(vertex)) {
            edg.remove();
        }
    }

上面的这段代买是我们改正之后的形式,功能相同,且可以正确的执行。

 

posted @ 2022-05-22 15:57  floral_sea  阅读(171)  评论(0)    收藏  举报