I am having trouble figuring why findAny()
throws a null pointer exception after filter()
operation on a stream. In this particular test case, the filt
No, it's not the behavior, when the stream doesn't contain any elements. In which case it instead returns an Optional.empty()
.
Also, the NPE is the cause of a null value in the stream, as stated in the javadocs:
Returns: an Optional describing some element of this stream, or an empty Optional if the stream is empty Throws: NullPointerException - if the element selected is null
Your confusion comes from the fact that you filter
first - and you would expect the filter
method to be somewhere in the stack trace; but notice that intermediate operations do nothing per-se, they are executed lazily and only kick in when a terminal operation is present (such as findAny
in your case). It's actually there in the stack trace (the filter method
), but it looks like this: Example.Main.lambda$main$0(Main.java:41)
.
If you want to filter null values, first do:
.filter(Objects::nonNull)
.filter(n -> n.textValue().equals("AES256"))
.findAny()
The best way to avoid NPE is:
Optional<JsonNode> encryption = sseEncryptionList.stream()
.filter(Objects::nonNull)
.filter(n -> "AES256".equals(n.textValue()))
.findAny();
"AES256".equals(n.textValue()))
will not throw NPE if n.textValue() is null