You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Chen (Jira)" <ji...@apache.org> on 2019/11/02 09:09:00 UTC

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

    [ https://issues.apache.org/jira/browse/COLLECTIONS-663?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16965277#comment-16965277 ] 

Chen edited comment on COLLECTIONS-663 at 11/2/19 9:08 AM:
-----------------------------------------------------------

Hi,Gary D.Gregory

Read the code, In the AbstractMultiValuedMap.java,

1、AbstractMultiValuedMap.MapIterator() methos will return private MultiValuedMapIterator class

2、MultiValuedMapIterator class will call AbstractMultiValuedMap.entries().iterator()

3、AbstractMultiValuedMap.entries() will return private EntryValues class

4、EntryValues class will return LazyIteratorChain overide nextIterator which call MultiValuedMapEntry class

5、MultiValuedMapEntry class setValue() method throw UnsupportedOperationException. 

so MapIterator.setValue() is not support!

Ithink it is a proplem, Should we solve this problem by submitting a PR?


was (Author: guoping1):
Hi,Gary D.Gregory

See code, In the AbstractMultiValuedMap.java,

1、AbstractMultiValuedMap.MapIterator() methos will return private MultiValuedMapIterator class

2、MultiValuedMapIterator class will call AbstractMultiValuedMap.entries().iterator()

3、AbstractMultiValuedMap.entries() will return private EntryValues class

4、EntryValues class will return LazyIteratorChain overide nextIterator which call MultiValuedMapEntry class

5、MultiValuedMapEntry class setValue() method throw UnsupportedOperationException. 

so MapIterator.setValue() is not support!

Ithink it is a proplem, Should we solve this problem by submitting a PR?

> 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
>            Assignee: Bruno P. Kinoshita
>            Priority: Trivial
>
> 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
> 			}
> 			// innerCollection.add(6); // adding stuff back should also work...
> 		}
> 	}{code}
> This test unexpectedly throws a ConcurrentModificationException.
> The issue is that when calling {{iterator.remove()}} the {{AbstractMultiValuedMap.ValuesIterator}} detects that the Collection is empty and calls {{AbstractMultiValuedMap.this.remove(key);}}.
> It may be better if the iterator of the inner collection had a reference on the iterator if the outer map and called {{containerIterator.remove()}} instead.
> *Note:* this solution would again present issues if the user tries to add new elements in this now empty collection (which was removed from the parent).
> In the current state, it is quite unclear why an exception is thrown, without debugging the code. 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)