【问题标题】:Java 8 Filter+Collect to list NullpointerException [closed]Java 8 Filter+Collect 列出 NullpointerException [关闭]
【发布时间】:2020-06-30 13:26:59
【问题描述】:

我一直在使用流 api 一段时间,但直到现在还没有遇到任何此类情况。为什么这段代码会抛出 NPE?

public static void main(String[] args) {
    MarkupModel m1 = new MarkupModel();
    m1.setOverrideFlag(true);
    MarkupModel m2 = new MarkupModel();
    m1.setOverrideFlag(false);
    List<MarkupModel> markupModelList = new LinkedList<>();
    markupModelList.add(m1);
    markupModelList.add(m2);
    List<MarkupModel> typeAMarkupStream = markupModelList.stream()
        .filter(markupModel -> !markupModel.getOverrideFlag())
        .collect(Collectors.toList()); //NPE thrown here
}

【问题讨论】:

  • 可能是拼写错误,但您仅为 m1 设置标志。
  • 确实是@Eritrean,标志是Boolean,所以m2有一个null
  • @Eritrean 你找到了。这是一个错字。我的坏!

标签: java list java-8 functional-programming java-stream


【解决方案1】:

您必须过滤 null 元素:

List<MarkupModel> typeAMarkupStream = markupModelList.stream()
    .filter(markupModel -> markupModel.getOverrideFlag() == null || !markupModel.getOverrideFlag())
    .collect(Collectors.toList());

【讨论】:

  • 但是为什么呢?我们可以很好地看到对象不为空。那检查不是没必要吗?
  • @DurlabhSharma 你是对的,对不起,这是overrideFlag,即null,因为它是一个对象(而不是原始对象),这应该可以解决你的问题
  • 这是我的代码中的一个错字。现在工作正常。我没有为这两个对象设置值。所以你的代码也可以处理这种情况,但我自己的代码有一个错误导致了这个问题。
  • @DurlabhSharma 说得对!
猜你喜欢
  • 2017-10-24
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多