PriorityQueue(collection) should throw NPE
David Holmes
David.Holmes at oracle.com
Thu May 6 23:53:05 UTC 2010
Hi Martin,
Martin Buchholz said the following on 05/07/10 09:13:
> On Thu, May 6, 2010 at 15:58, David Holmes <David.Holmes at oracle.com> wrote:
>>> Fix:
>>>
>>> http://cr.openjdk.java.net/~martin/webrevs/openjdk7/PriorityQueueConstructor/
>> I'm not sure this is necessarily the right fix. It seems to me that
>> incidental nulls will be caught in many/most cases by the sorting code for
>> collections assumed to contain Comparable's.
>
> The comparator might accept nulls.
True but a Comparator is only used if the Collection is a SortedSet or a
PriorityQueue. For any other Collection the elements must implement
Comparable and the code in:
private void siftDownComparable(int k, E x) {
Comparable<? super E> key = (Comparable<? super E>)x;
int half = size >>> 1; // loop while a non-leaf
while (k < half) {
int child = (k << 1) + 1; // assume left child is least
Object c = queue[child];
int right = child + 1;
if (right < size &&
((Comparable<? super E>) c).compareTo((E) queue[right])
> 0)
c = queue[child = right];
if (key.compareTo((E) c) <= 0)
break;
queue[k] = c;
k = child;
}
queue[k] = key;
}
will throw NPE at key.compareTo if the item is null. (There's probably a
missed case where the collection contains only a null element).
> But even if it doesn't, it is possible to create a "corrupted" PQ
> using the PQ(collection) constructor, and we don't allow
> that sort of thing in java.util.
But that's the hole we're fixing now.
>> And we don't need to check when
>> filling from an existing PriorityQueue.
>
> Strictly speaking, the source PriorityQueue might be a subclass that
> has been modified to accept nulls.
Yes I suppose. So we could change from an instanceof test to a
getClass() test.
> But yes, we could have a version of the fix that only checks for nulls
> if the source is not a PQ.
>
>> So is it only the case for filling
>> from a SortedSet that needs the explicit null check?
>
> The source can be an arbitrary Collection.
But as noted above for anything other than a SortedSet (or corrupt PQ)
the sorting code will already catch nulls.
Cheers,
David
> Martin
>
>> David
>>
More information about the core-libs-dev
mailing list