Bug in ArrayList iterator
Remi Forax
forax at univ-mlv.fr
Wed Jan 7 13:07:14 UTC 2015
On 01/07/2015 11:47 AM, Daniel Fuchs wrote:
> On 07/01/15 11:31, Paul Sandoz wrote:
>>
>> On Jan 7, 2015, at 10:45 AM, Remi Forax <forax at univ-mlv.fr> wrote:
>>
>>> A simple Java question, what this code does ?
>>>
>>> ArrayList<String> list = new ArrayList<>();
>>> list.add("foo");
>>> list.add("bar");
>>> for(String s: list) {
>>> list.remove(s);
>>> }
>>>
>>> :(
>>>
>>
>> We could improve the best-effort basis by which
>> ConcurrentModificationException is thrown by snapshotting the
>> collection size on construction of the iterator (at the expense of an
>> extra field, but that might pack into a spare 4 bytes due to
>> alignment at least on 64 bits IIUC).
yes, note that AbstractList.Itr exhibit the same issue.
I fear that fixing this bug may break some programs.
>
> Or call checkForComodification() when cursor == size in hasNext()?
No, you can't.
The contract of AbstractList.modCount is pretty clear about that:
https://docs.oracle.com/javase/7/docs/api/java/util/AbstractList.html#modCount
hasNext() can not call checkForComodification().
>
> -- daniel
Rémi
>
>>
>> Paul.
>>
>>> Rémi
>>> tip: the bug lies in ArrayList.Itr.hasNext() (and
>>> AbstractList.Itr.hasNext()).
>>>
>>
>
More information about the core-libs-dev
mailing list