Bug in ArrayList iterator

Chris Hegarty chris.hegarty at oracle.com
Wed Jan 7 12:02:42 UTC 2015


On 07/01/15 11:22, Stanislav Baiduzhyi wrote:
> On Wednesday 07 January 2015 11:20:57 you wrote:
>> On 07/01/15 10:57, Stanislav Baiduzhyi wrote:
>>> On Wednesday 07 January 2015 10:56:01 Chris Hegarty wrote:
>>>>             public boolean hasNext() {
>>>>
>>>> -            return cursor != size;
>>>> +            return cursor != itrSize;
>>>>
>>>>             }
>>>
>>> If the user will invoke list.remove(E) to remove current or previous
>>> element then iterator will be skipping some elements.
>>
>> If this happens, then next() and/or remove() will throw CME.
>>
>>    Throwing ConcurrentModification
>>
>>> in hasNext() looks better in such case.
>>
>> It is not clear to me that users would be expecting CME from hasNext(),
>> whereas it is more next() and remove() is more obvious.
>
> Yes, but that exactly how it works now, that's why second invocation of
> hasNext() returns false and we can see the issue Remi is talking about. If
> hasNext() will be throwing ConcurrentModification than will work as early
> warning system that something is wrong with this iterator.

The changes in the patch I suggested will change existing behavior. In 
Remi's case, hasNext() will now return true, and next() will throw CME.

-Chris.



More information about the core-libs-dev mailing list