【发布时间】:2015-07-10 06:54:32
【问题描述】:
让我们考虑一个只包含一个Integer 属性的Parent 类。
我创建了 6 个父类对象和一个空变量。然后我将这些对象添加到列表中。
我想通过Integer属性的值来检索对应的对象。
我为此使用了 Java 8 Streams。
Predicate<Parent> predicate = e -> e.getId() == 100; // sample attribute value
result = list.stream().filter(predicate).collect(Collectors.toList());
但是我得到了NullPointerException,所以我编辑了代码:
list.stream().filter(h -> h!=null).filter(predicate).collect(Collectors.toList());
但是如果任何对象为空,我想抛出异常。如果列表中没有对象为空,那么我想从列表中检索相应的对象。
如何使用 Java 8 Streams 使用单个语句来实现这一点?
【问题讨论】:
-
您的第一个答案就是这样做对吗?那你为什么要过滤掉
null的值呢? -
为什么不简单地捕获 NPE,将其包装在您自己的异常中,然后抛出该异常?
-
@Buurman:捕获 NPE 实际上非常危险:如果代码中存在编程错误并且由于其他原因存在 NPE,该怎么办?那么它会被误认为列表中没有
Parent。 -
@Lii:这很容易检查:
catch(NullPointerException ex){ if(list.contains(null)) throw new CustomException(); else throw ex; },这样可以保留其他 NPE。检查有一些成本,但这并不重要,因为它只在错误的情况下执行。 -
@Holger:嗯...我真的不认为这是一个好习惯。当列表也包含 null 时,可能会触发意外的 null 取消引用。我会坚持始终避免捕获 NPE 的规则。太容易出错了,因为它们基本上可以扔到任何地方。棘手的例子:如果
e.getId()碰巧返回一个空的Integer。
标签: java lambda java-8 nullpointerexception