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