Java遇见空指针,在filter()操作过滤掉所有内容后,Java流findAny()遇到空指针异常...

I am having trouble figuring why findAny() throws a null pointer exception after filter() operation on a stream. In this particular test case, the filter operation should have filtered out everything, leaving no results for findAny().

Optional encryption = sseEncryptionList.stream()

.filter(n -> n.textValue().equals("AES256")) //Filters out everything

.findAny(); //Throws null pointer exception

The stack trace:

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)

Is this expected behavior for findAny() to throw a null pointer exception if the stream doesn't contain any elements?

Edit: What is an elegant and functional way to resolve filter operations that might filter out all elements?

解决方案

The best way to avoid NPE is:

Optional 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值