我有一个具有以下签名的地图(多种地图):

Map<String, Set<String>> motherChildIndex;


如果键在映射中不存在,我希望它返回一个空集(与null相对),因此我偶然发现了getOrDefault方法,该方法应允许我有效地“忽略”空值。

这是我的相关代码:

motherChildIndex
        .getOrDefault(personId, Collections.emptySet()) //personId is just a string that may or may not be in the map, hence getOrDefault
        .stream() //I get the warning here
        .map(personsIndex::get) //Not important to reproduce
        .forEach(children::add); //Not important to reproduce


.stream()行上,我收到警告:


  方法调用“流”可能会产生“ java.lang.NullPointerException”


为什么?我以为getOrDefault()应该永远不会返回null。

我将Android Studio用作我的IDE,如果有什么不同的话。

最佳答案

看起来getOrDefault()在Map.class中具有LatestNullable批注,该批注看起来像Nullable批注(这完全是我的烦恼,如果您想阅读以下内容,唯一的问题是这个:what is the @RecentlyNonNull annotation?)。

因此,我假设IntelliJ读取了它并立即警告您可能返回空值,因此认为stream()可能会抛出NullPointerException(因为IntelliJ映射可以为null),然后建议您对nonNull进行检查地图。

奇怪的是(显然在stackoverflow问题中)注释不在Java文档中。

09-11 17:14