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

标签 java java-8 java-stream option-type

为什么会抛出 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() 返回 Optional ,这让 findFirst() 能够处理 null 更有意义。

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

最佳答案

原因是使用了Optional<T>在返回。 Optional 不允许包含 null .从本质上讲,它无法区分“它不存在”和“它存在,但它被设置为 null”的情况。

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

Throws:

NullPointerException - if the element selected is null

关于java - 如果 findFirst() 找到的第一个元素为 null,为什么会抛出 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32466799/

相关文章:

java - 我捕获了异常,但仍然看到它在日志中抛出

java - dispatchKeyEvent 在 Unity 中不触发 - native Android 插件

java - 如何以 FIFO 顺序从文件夹中轮询文件

java - 如何在 java 8 中将 List 转换为 Map,.map 函数在链中

java - 根据两个List的内容生成SortedMap

java - 如何使用外部文件夹和 Jars 创建 Jar 文件

Java 8 流 + 映射 + ForEach + 收集

java - 在 Java 8 中收集流的元素并将其中一些元素减少为结果集合中的单个元素

java - java8中的流切割

java - 调用对可能实现该接口(interface)的对象进行接口(interface)约束的泛型方法