当前位置: 首页 > 知识库问答 >
问题:

如果findFirst()找到的第一个元素为null,为什么会抛出NullPointerException?

朱炳
2023-03-14

为什么会抛出一个java。lang.NullPointerException

List<String> strings = new ArrayList<>();
strings.add(null);
strings.add("test");

String firstString = strings.stream()
        .findFirst()      // Exception thrown here
        .orElse("StringWhenListIsEmpty");
        //.orElse(null);  // Changing the `orElse()` to avoid ambiguity

strings中的第一项是null,这是一个完全可以接受的值。此外,findFirst()返回一个可选值,这对于findFirst()能够处理nulls更有意义。

编辑:更新orElse()以减少歧义。

共有3个答案

濮阳钟展
2023-03-14

你可以使用java。util。物体。非空在查找前过滤列表

差不多

list.stream().filter(Objects::nonNull).findFirst();
司马高昂
2023-03-14

如前所述,API设计人员并不认为开发人员希望以相同的方式处理null值和缺少的值。

如果您仍然想这样做您可以通过应用序列显式地这样做

.map(Optional::ofNullable).findFirst().flatMap(Function.identity())

去小溪边。如果没有第一个元素或第一个元素为null,则在这两种情况下,结果都将是空可选的。所以在你的情况下,你可以使用

String firstString = strings.stream()
    .map(Optional::ofNullable).findFirst().flatMap(Function.identity())
    .orElse(null);

如果第一个元素不存在或null则获取null值。

如果要区分这些情况,可以省略flatMap步骤:

Optional<String> firstString = strings.stream()
    .map(Optional::ofNullable).findFirst().orElse(null);
System.out.println(firstString==null? "no such element":
                   firstString.orElse("first element is null"));

这和你更新的问题没什么不同。只需将中的“无此类元素”替换为“StringWhenListEmpty”中的“第一个元素为空”替换为。但如果你不喜欢条件句,你也可以通过以下方式实现:

String firstString = strings.stream().skip(0)
    .map(Optional::ofNullable).findFirst()
    .orElseGet(()->Optional.of("StringWhenListIsEmpty"))
    .orElse(null);

现在,firstString如果一个元素存在,但它是null,那么它将是“StringWhenListIsEmpty”

王炜
2023-03-14

原因是使用了Optional

这就是为什么文档明确禁止在findFirst()中选择null的情况:

投掷:

NullPointerException-如果所选元素为null

 类似资料:
  • 问题内容: 在Java 9中,在Set接口上引入了称为of()的新静态工厂方法,该方法接受多个元素,甚至是元素数组。 我想将一个列表变成一个集合,以删除集合中的所有重复条目,这可以使用以下方法完成(在Java 9之前): 但是我认为使用这种新的Java 9静态工厂方法很酷: 其中是先前定义的字符串列表。 但是,可惜的是,当元素重复时,java抛出了一个,该方法的Javadoc中也对此做了说明。为什

  • 问题内容: 根据文档,该方法返回: 如果参数是,则字符串等于; 否则,返回的值。 但是,当我尝试这样做时,怎么会这样: 它会抛出NPE吗?(如果你不相信,请自己尝试!) 怎么会这样呢?文件在骗我吗?这是Java中的主要错误吗? 问题答案: 问题是方法已重载: String.valueOf(Object) String.valueOf(char[]) Java规范语言要求在这种情况下,选择最具体的重

  • 这是我写的,这是一个简单的程序,可以登录我的instagram帐户,凭证已更改: 我不知道它为什么会出错。请帮忙。 Chrome确实打开了登录页面,但找不到元素。 附言:你可以猜到我是新来的 编辑: 我想,当我使用time.sleep几秒钟,它正常工作......但我不认为这是修复它的最佳方式,所以请注意,并建议我一些东西,或者这是它实际上是如何工作的......

  • 我有一个想要减少的枚举值流。如果流为空或包含不同的值,我希望。如果它只包含一个值(的多个实例),我想要那个值。 我试着用减音来做: 不幸的是,这不起作用,因为当结果为时,这个reduce方法抛出一个。有人知道为什么会这样吗?为什么不是有效的结果? 现在,我是这样解决的: 在这起作用的同时,我并不满足于这种“弯路”。我喜欢减少,因为它似乎是合适的,把所有的东西都放进一个流。 有没有人能想出一个替代r

  • 我试图将两个“Employee”对象添加到树集中: 但它引发了一个ClassCastException: 但是如果我只向TreeSet添加一个对象: 或者如果我使用哈希集: 那么它就是成功的。为什么会发生异常,如何修复它?

  • 问题内容: 我正在使用“替换”功能删除div中的所有非数字值。 看来Jquery replace只影响第一个元素。 这是我的Jquery: HTML代码: 结果: 2011 c20ff113。c201gf76341。 我想要的结果是: 2011 20113 20176341 问题答案: 您有重复的ID,这是无效的,并且还有jQueryID选择器(或jQuery内部使用的任何其他ID选择器,例如do