gpt4 book ai didi

java - findFirst 抛出 java.lang.NullPointerException

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:43 24 4
gpt4 key购买 nike

我在下面有这段代码。findfirst 调用抛出 NullPointerException 即使我有一个 orElseGet 调用链接

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");

但是,如果我按如下所示进行过滤器调用,它会正常工作:

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 ,而且乍一看还不太清楚这些情况是什么。在第一种情况下,它返回一个 stream,其中包含 null 元素,它会抛出 NullPointerException,在第二种情况下,它返回一个空流,它可以正常工作很好。

最佳答案

您的代码明确返回 null

return null

根据 Optional.findFirst 的规范,此后抛出 NPE内容如下:

@throws NullPointerException if the element selected is null
Optional<T> findFirst();

此外,为了阐明代码控制甚至无法到达 orElseGet 部分,无论如何假设它在 Optional(空的或具有某些值)上工作。


一些建议:

  • 不要忽视异常,尤其是当您已经捕获了所有异常中最通用的异常时。
  • 避免在迭代中显式返回 null,这似乎与您随后进行迭代的原因相矛盾。
  • 在您当前的代码中更安全,您可以使用 filter as

    仅过滤非空对象
    Stream.iterate(0, n -> n + 1).map(i -> {
    try {
    return req.substring(numberOfRetry - i);
    } catch (Exception e) {
    err.add(e);
    }
    return null;
    })
    .filter(Objects::nonNull)
    .limit(1)
    .findFirst()
    .orElse("Exception");

关于java - findFirst 抛出 java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52820984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com