在收集流结果时获取意外的NullPointerException

Fra*_*ire 1 java nullpointerexception java-8 java-stream

从流中收集数据时,我遇到了一个令人讨厌的NullPointerException。在我看来,我不应该得到一个,这就是困扰我的地方。

这是错误的代码:

descriptiveData
    .stream()
    .map(Signaletiques::getContrats)
    .filter(Objects::nonNull)
    .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

descriptiveData不为null,并且不包含任何null对象,但是getContrats的结果可能是。这是一个非常有效的商业情况,我认为使用过滤器来处理它是解决问题的方法,但我所能得到的只是这个异常:

原因:java.util.stream.ReferencePipeline $ 3 $ 1.accept(ReferencePipeline.java:193)处的java.lang.NullPointerException java.util.stream处的java.util.ArrayList $ ArrayListSpliterator.tryAdvance(ArrayList.java:1351) .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。 java.util.stream.FindOps $ FindOp.evaluateSequential(FindOps.java:152)的java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)的stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) .util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)位于be.formatech.forhrm.appipay.synchrosignaletique.service.impl。SynchronisationAppipayUcmIdFetcherImpl.searchWorkerIdThroughContractsData(SynchronisationAppipayUcmIdFetcherImpl.java:141)`

知道这可能来自什么吗?

编辑:

我真的很抱歉 !

我在descriptiveData列表中确实有一个空值,但是IntelliJ并未显示它: 在此处输入图片说明

感谢@Nikolas提供的答案确实正确。

Nik*_*las 5

descriptiveData的确不包含null价值-这可能是以后添加。然后,您还需要过滤掉这些null值。只需.filter(..)在该.map(..)行之前添加另一个:

descriptiveData
    .stream()
    .filter(Objects::nonNull)
    .map(Signaletiques::getContrats)
    .filter(Objects::nonNull)
    .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

  • 我也编辑我的答案,因为正如您所说,`Signaletiques :: getContrats`可能也返回`null`值,因此也需要过滤。 (2认同)