首页 > 解决方案 > 尽管 Optional<> 出现空指针异常

问题描述

我有:

List<Optional<MyObject>> myList;

该列表是通过从文件中读取来填充的。文件读取完成后,我会检查空列表: if(myList.size() == 0){//} 然后执行以下操作:

myList.stream()
    .filter(Optional::isPresent)
    .map(i → i.orElse(new MyObject(“adventureBook”, 20))
    .collect(groupingBy(MyObject::getBookType, TreeMap::new, mapping(MyObject::getBookPrice, toList())));

我有大约 350k MyObject 文件要读取,300k 文件可以正常读取,但是当我尝试读取整批 c.350k 文件时,它会在 collect() 上引发空指针异常。

尽管包裹在 Optional<> 并检查 Optional::isPresent、Optional::orElse 等仍然有一个空对象设法偷偷溜过,并且考虑到我有这么多的文件,什么是最好的尝试和缩小错误文件的范围?谢谢

编辑:添加堆栈跟踪

Exception in thread "main" java.lang.NullPointerException
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at com.mypackage.MyObject.main(MyObject.java:108)

标签: javaoptional

解决方案


那么可能是非null 中的属性之一MyObject是null 吗?您确实在做filter(Optional::isPresent),但这并不意味着字段本身不为空。MyObject::getBookType或者MyObject::getBookPrice很容易仍然为空。


推荐阅读