Java 流查找任何() 在 filter() 操作筛选出所有内容后遇到空指针异常

2022-09-03 01:32:46

我无法弄清楚为什么在对流执行操作后会引发空指针异常。在此特定测试用例中,筛选器操作应已筛选出所有内容,而不留下 任何结果。findAny()filter()findAny()

Optional<JsonNode> encryption = sseEncryptionList.stream()
                  .filter(n -> n.textValue().equals("AES256")) //Filters out everything
                  .findAny(); //Throws null pointer exception

堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
at example.Main.lambda$main$0(Main.java:41)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1351)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findAny(ReferencePipeline.java:469)
at example.Main.main(Main.java:42)

如果流不包含任何元素,则引发空指针异常的预期行为是否为 ?findAny()

编辑:解决可能过滤掉所有元素的过滤器操作的优雅而实用的方法是什么?


答案 1

避免NPE的最佳方法是:

Optional<JsonNode> encryption = sseEncryptionList.stream()
              .filter(Objects::nonNull)
              .filter(n -> "AES256".equals(n.textValue()))
              .findAny();

"AES256".equals(n.textValue()))如果 n.textValue() 为 null,则不会抛出 NPE


答案 2

您的困惑来自于您首先的事实 - 并且您希望该方法位于堆栈跟踪中的某个位置;但请注意,中间操作本身并不做任何事情,它们被懒惰地执行,并且仅在存在终端操作时才启动(例如在您的情况中)。它实际上存在于堆栈跟踪 (the ) 中,但它看起来像这样:.filterfilterfindAnyfilter methodExample.Main.lambda$main$0(Main.java:41)

如果要筛选空值,请先执行以下操作:

.filter(Objects::nonNull)
.filter(n -> n.textValue().equals("AES256"))
.findAny()

推荐