You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Christophe Schmaltz (JIRA)" <ji...@apache.org> on 2017/11/04 17:39:00 UTC

[jira] [Created] (COLLECTIONS-663) Unexpected ConcurrentModificationException when altering Collection of a MultiValuedMap

Christophe Schmaltz created COLLECTIONS-663:
-----------------------------------------------

             Summary: Unexpected ConcurrentModificationException when altering Collection of a MultiValuedMap
                 Key: COLLECTIONS-663
                 URL: https://issues.apache.org/jira/browse/COLLECTIONS-663
             Project: Commons Collections
          Issue Type: Bug
            Reporter: Christophe Schmaltz


Testcase:
{code}	@Test
	public void test() {
		MultiValuedMap<Integer, Integer> multiMap = new HashSetValuedHashMap<>();
		multiMap.put(1, 10);
		multiMap.put(2, 20);
		for (Collection<Integer> innerCollection : multiMap.asMap().values()) {
			for (Iterator<Integer> iterator = innerCollection.iterator(); iterator.hasNext();) {
				Integer i = iterator.next();
				iterator.remove(); // only the innerCollection is altered
			}
		}
	}{code}
This test unexpectedly throws a ConcurrentModificationException.
The issue is that when calling {{iterator.remove()}} the {{multimap.AbstractMultiValuedMap.ValuesIterator}} detects that the Collection is empty and calls {{AbstractMultiValuedMap.this.remove(key);}}.

It would be better if the iterator of the inner collection had a reference on the iterator if the outer map and called {{containerIterator.remove()}} instead.


In the current state, it is quite unclear why an exception is thrown, without debugging the code.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)