1

私は学校のプロジェクトに取り組んでいますが、今は少し立ち往生しています

私の問題は、私が正方形のarrayListを持っていることです。各正方形には値(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);
            }
        }
    }
4

4 に答える 4

3

反復している間、コレクションから要素を削除しています。この状況ではイテレータが予測できない結果を生成する可能性があるため、発生した例外をすばやくスローして失敗します。

コレクションをトラバースしている間は、イテレータのメソッドを介してのみコレクションを変更できます。イテレータ自体にremoveメソッドが必要です。これにより、現在の要素が削除され、イテレータがそのまま保持されます。

于 2012-06-08T10:28:05.797 に答える
2

反復中は、Iteratorオブジェクトを削除するためにインスタンスを使用する必要があります。

itre.remove();

于 2012-06-08T10:25:04.217 に答える
1

次のように試すことができます:

itre.remove();
于 2012-06-08T10:57:43.097 に答える
0

ITERATOR では、反復中に変更することはできません..代わりにループを使用する必要があります..これは、他のスレッドがリストを変更しているときに、Iterator を使用しているため発生します...

于 2012-06-08T10:27:01.180 に答える