NPEs Re: uniqueElements().iterator() returns broken iterator

Dmitry Bessonov dmitry.bessonov at oracle.com
Fri Nov 30 13:39:06 PST 2012


On 30.11.2012 21:21, Paul Sandoz wrote:
> Thanks.
>
> Note that the EG is still cogitating on what to be about nulls. Until agreement is reached this area is up for change.

BTW, I have bumped once again into NPE thrown from

  Arrays.asStream(null, null, null).findFirst();
  Arrays.asStream(null, null, null).findAny();


And the previous answer for the this question was that it's an expected NPE.

However as it was pointed out recently - a "bare" NPE thrown from inside 
the implementation might not be a great thing:

Exception in thread "main" java.lang.NullPointerException
     at java.util.Objects.requireNonNull(Objects.java:201)
     at java.util.Optional.<init>(Optional.java:53)
     at java.util.streams.ops.FindAnyOp.evaluate(FindAnyOp.java:56)
     at 
java.util.streams.ops.FindAnyOp.evaluateSequential(FindAnyOp.java:51)
     at 
java.util.streams.ops.FindAnyOp.evaluateSequential(FindAnyOp.java:36)
     at 
java.util.streams.AbstractPipeline.evaluateSequential(AbstractPipeline.java:206)
     at 
java.util.streams.AbstractPipeline.evaluate(AbstractPipeline.java:134)
     at 
java.util.streams.AbstractPipeline.pipeline(AbstractPipeline.java:487)
     at java.util.streams.ValuePipeline.findAny(ValuePipeline.java:157)


-Dmitry

>
> However, i will fix things next week so nulls are not ignored and java.util.NoSuchElementException is not thrown on iteration.
>
> Paul.
>
>
> On Nov 30, 2012, at 5:28 PM, Georgiy Rakov <georgiy.rakov at oracle.com> wrote:
>
>> Hello again,
>>
>> when executing uniqueElements() on stream consisting of null elements broken iterator is returned.
>>
>> Consider following code.
>>
>>    import java.util.ArrayList;
>>    import java.util.Arrays;
>>    import java.util.Iterator;
>>    import java.util.List;
>>
>>    public class UniqueElementsIssue3 {
>>         public static void main(String arg[]) {
>>             Iterator<Integer> it = Arrays.asStream(new Integer[]{null,
>>    null, null}).uniqueElements().iterator();
>>             Integer i = null;
>>             List<Object> result1 = new ArrayList<>();
>>             while (it.hasNext()) {
>>                 i = it.next();
>>                 result1.add(i);
>>             }
>>             System.out.println("resul1=" +
>>    Arrays.toString(result1.toArray()));
>>         }
>>    }
>>
>> This code throws the exception with following stacktrace.
>>
>>    Exception in thread "main" java.util.NoSuchElementException
>>         at java.util.streams.ops.UniqOp$2.next(UniqOp.java:118)
>>         at UniqueElementsIssue3.main(UniqueElementsIssue3.java:19)
>>
>> The reason is obvious: it.next() fails while it.hasNext() returns true.
>> This occurs for stream in parallel mode as well.
>>
>> Could you please tell when we could expect this bug to be fixed (and others on uniqueElements - see two my previous letters).
>>
>> Source code is attached for your convenience.
>>
>> Thanks,
>> Georgiy,
>> <UniqueElementsIssue3.java>
>



More information about the lambda-dev mailing list