33

この例外が発生する単純なループでコレクションをループしてコレクションから削除しようとするかどうかはわかっています: java.util.ConcurrentModificationException. しかし、私は Iterator を使用していますが、それでもこの例外が生成されます。それを解決する理由と方法はありますか?

HashSet<TableRecord> tableRecords = new HashSet<>();

...

    for (Iterator<TableRecord> iterator = tableRecords.iterator(); iterator.hasNext(); ) {
        TableRecord record = iterator.next();
        if (record.getDependency() == null) {
            for (Iterator<TableRecord> dependencyIt = tableRecords.iterator(); dependencyIt.hasNext(); ) {
                TableRecord dependency = dependencyIt.next(); //Here is the line which throws this exception
                if (dependency.getDependency() != null && dependency.getDependency().getId().equals(record.getId())) {
                    tableRecords.remove(record);
                }
            }
        }
    }
4

4 に答える 4

51

iterator.remove()代わりに使用する必要がありますtableRecords.remove()

反復子から remove メソッドを使用する場合にのみ、反復するリストの項目を削除できます。

編集 :

イテレーターを作成すると、コレクションに適用された変更のカウントが開始されます。メソッドを使用せずに (または同じコレクションで別の反復子を使用して) いくつかの変更が行われたことを反復子が検出した場合、同じ要素を 2 回渡したり、1 つをスキップしたりしないことを保証できないため、この例外をスローします。

これは、コードを変更して、iterator.remove を介してのみ項目を削除するようにする必要があることを意味します (かつイテレーターを 1 つだけ使用します)。

また

削除するアイテムのリストを作成し、反復が終了したら削除します。

于 2013-06-06T15:01:22.673 に答える