我有下面的代码。即使我链接了一个orElseGet调用,findfirst调用也会抛出NullPointerException
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,而且乍一看这些情况是什么还不是很清楚。在第一种情况下,它返回一个包含null元素的stream,这会抛出NullPointerException,在第二种情况下,它会返回一个空流,但工作得很好。
发布于 2018-10-16 00:35:27
当你这样做时,你认为会发生什么:
System.out.println(req.substring(numberOfRetry - i));zero第一次出现在i哪里?将抛出一个越界异常--你捕获它并返回null;因此你有一个调用findFirst的Stream.of(null) --它被记录为在元素为空的情况下引发NullPointerException。
发布于 2018-10-16 00:29:55
这是因为您在map函数中返回了null。尝试在map操作后添加.filter(s -> s != null)。
https://stackoverflow.com/questions/52820984
复制相似问题