首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >findFirst抛出java.lang.NullPointerException

findFirst抛出java.lang.NullPointerException
EN

Stack Overflow用户
提问于 2018-10-16 00:26:27
回答 2查看 2.9K关注 0票数 6

我有下面的代码。即使我链接了一个orElseGet调用,findfirst调用也会抛出NullPointerException

代码语言:javascript
复制
int numberOfRetry = 5;
String req = "abc";
String res =
    Stream.iterate(0, n -> n + 1).map(i -> {
        try {
            return req.substring(numberOfRetry - i);
        } catch (Exception e) {
            // log exception
        }
        return null;
    })
    .limit(1)
    .findFirst()
    .orElseGet(() -> "Exception");

但是,如果我按如下所示放入一个过滤器调用,它就能正常工作:

代码语言:javascript
复制
int numberOfRetry = 5;
String req = "abc";
String res =
    Stream.iterate(0, n -> n + 1).map(i -> {
        try {
            return req.substring(numberOfRetry - i);
        } catch (Exception e) {
            // log exception
        }
        return null;
    })
    .limit(1)
    .filter(Objects::nonNull)
    .findFirst()
    .orElseGet(() -> "Exception");

我猜在某些情况下我们不能显式返回null,而且乍一看这些情况是什么还不是很清楚。在第一种情况下,它返回一个包含null元素的stream,这会抛出NullPointerException,在第二种情况下,它会返回一个空流,但工作得很好。

EN

回答 2

Stack Overflow用户

发布于 2018-10-16 00:35:27

当你这样做时,你认为会发生什么:

代码语言:javascript
复制
System.out.println(req.substring(numberOfRetry - i));

zero第一次出现在i哪里?将抛出一个越界异常--你捕获它并返回null;因此你有一个调用findFirstStream.of(null) --它被记录为在元素为空的情况下引发NullPointerException

票数 3
EN

Stack Overflow用户

发布于 2018-10-16 00:29:55

这是因为您在map函数中返回了null。尝试在map操作后添加.filter(s -> s != null)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52820984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档