1. ホーム
  2. java

[解決済み] ConcurrentModificationExceptionがスローされる理由とそのデバッグ方法

2022-04-28 13:42:07

質問

を使用しています。 Collection (a HashMap を間接的に使用するようになりました。 ConcurrentModificationException 何が原因で、どうすればこの問題を解決できるのでしょうか?同期をとっているのでしょうか?

以下は、スタックトレースの全容です。

Exception in thread "pool-1-thread-1" java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
        at java.util.HashMap$ValueIterator.next(Unknown Source)
        at org.hibernate.collection.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:555)
        at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
        at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
        at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
        at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
        at org.hibernate.engine.Cascade.cascade(Cascade.java:130)

どのように解決するのですか?

これは同期の問題ではありません。 これは、反復処理されている基礎となるコレクションが、イテレータ自身以外の何かによって変更された場合に発生します。

Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
    Entry item = it.next();
    map.remove(item.getKey());
}

これは ConcurrentModificationException を指定した場合 it.hasNext() が2回目に呼ばれる。

正しいやり方は

Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
    Entry item = it.next();
    it.remove();
}

このイテレータが remove() 演算を行うことができます。