【问题标题】:ArrayList remove errorArrayList 删除错误
【发布时间】:2012-06-12 09:45:12
【问题描述】:

我正在为学校做一个项目,但我现在有点卡住了

我的问题是我有一个正方形数组列表 每个 Square 都有一个值(从 0 到 100)。它的起始值为 9999,所以我可以检查它是否被选中。 如果选中了一个正方形,我希望将其从 arrayList 中删除。 所以过了一会儿就没有正方形了。

有一些代码设置了第一个值,这就是为什么我检查值是否为 9999。

但我得到一个错误。以前没见过的。

线程“AWT-EventQueue-0”java.util.ConcurrentModificationException 中的异常

Vak = 正方形

这是我的代码:

while (!vakken.isEmpty()) { // check if empty
        Iterator itrVak = vakken.iterator();
        while (itrVak.hasNext()) {
            Vak vak = (Vak) itrVak.next(); // here is get the error
            if (vak.getValue() != 9999) {// check if square value is 9999
                Collection checkVakken = vak.getNeighbour().values();
                Iterator itre = checkVakken.iterator();
                while (itre.hasNext()) {
                    Vak nextVak = (Vak) itre.next();
                    if (nextVak != null) {
                        if (nextVak.getValue() == 9999) {
                            nextVak.setValue(vak.getValue() + 1); // set value by its neighbour
                            vakken.remove(vak);
                            checkvakken.add(vak);
                        }
                    }
                }
            } else {
                vakken.remove(vak);
                checkvakken.add(vak);
            }
        }
    }

【问题讨论】:

    标签: java arraylist iterator is-empty


    【解决方案1】:

    在迭代集合时,您正在从集合中移除元素。由于迭代器在这种情况下可能会产生不可预知的结果,因此它无法快速抛出您遇到的异常。

    您只能在遍历集合时通过迭代器的方法更改集合。迭代器本身应该有 remove 方法,删除当前元素并保持迭代器完好无损。

    【讨论】:

    • 所以应该是itrVak.remove();?但是当我这样做时,它会在线程“AWT-EventQueue-0”java.lang.IllegalStateException 中引发异常
    【解决方案2】:

    在迭代时,你应该使用Iterator 实例来移除对象:

    itre.remove();

    【讨论】:

    • 但必须从 vakken 中删除,而不是从迭代器中删除。因此,如果它是一个迭代器并且我将其删除,它也将从 vakken(arrayList) 中删除
    • @KevinKamer:它将从原始实例中删除。
    • 一个迭代器不允许我删除一个对象。只删除他正在处理的内容。但它在线程“AWT-EventQueue-0”java.lang.IllegalStateException 中引发异常
    • 它将删除当前项目。使用正确的迭代器实例。
    • @PrinceJohnWesley,我认为在迭代器类中没有像 remove() 这样带有争论的方法。你可以这样调用:itre.remove();
    【解决方案3】:

    你可以这样试试:

    itre.remove();
    

    【讨论】:

      【解决方案4】:

      迭代器从不允许您在迭代时进行修改..您需要使用循环来代替..发生这种情况是因为您正在使用迭代器,同时其他线程正在修改列表...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-06
        • 2018-01-20
        • 2015-05-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-18
        • 2018-03-23
        相关资源
        最近更新 更多