Reponse to bug report (spurious ConcurrentModificationException in ArrayList)

David Holmes david.holmes at oracle.com
Thu Aug 20 05:02:00 UTC 2015


Hi,

I've added the information below to the bug report for you.

David

On 11/08/2015 2:13 PM, Cyrille Artho wrote:
> Dear all,
> I'd like to write a response to my bug report at
> https://bugs.openjdk.java.net/browse/JDK-8114832
> but I didn't get an OpenJDK login when I submitted the report.
>
> In this particular case, it should be noted that my test was minimal. If
> one has at least one element in the list before the iterator is created,
> then it.next() throws no exception when used on any collection except
> ArrayList/Stack/Vector.
>
> This means that ArrayList and its legacy brethren are the only classes
> that generate a spurious exception, and only after list.remove(-1) was
> called before using the iterator. The spurious exception prevents future
> access to data where other containers work as expected.
>
> Currently it is being considered to keep the current (faulty) behavior,
> but based on the new test case, I strongly advise correcting this bug.
>
> With the new test case, the information about the bug becomes:
>
> EXPECTED -
> it.next() returns 42
> ACTUAL -
> ConcurrentModificationException
>
> REPRODUCIBILITY :
> This bug can be reproduced always.
>
> ---------- BEGIN SOURCE ----------
> import java.util.ArrayList;
> import java.util.LinkedList;
> import java.util.ConcurrentModificationException;
> import java.util.Iterator;
> import java.util.NoSuchElementException;
>
> public class iterator_test {
>     public static void main(String[] argv) {
>       /* BUG: Sequence of arrayList.iterator,
>          arrayList.add(new Integer(1)),
>          arrayList.remove(-1),
>          iterator.next
>          produces ConcurrentModificationException. */
>       ArrayList<Integer> testArrayList = new ArrayList<Integer>();
>       testArrayList.add(new Integer(42));
>       Iterator<Integer> it = testArrayList.iterator();
>       try {
>         testArrayList.remove(-1);
>       } catch (IndexOutOfBoundsException e) {
>       }
>       try {
>         Integer result = it.next();
>         assert(result == 42);
>       } catch (ConcurrentModificationException e) {
>         System.err.println("Should be 42!");
>       }
>     }
> }
>
> ---------- END SOURCE ----------



More information about the core-libs-dev mailing list