【发布时间】:2022-01-24 18:34:22
【问题描述】:
我有 List<Long> countriesList,其中包含 Long 值,它们是国家/地区 ID。
现在我正在使用streams 迭代一些List<UserRequests> 列表。
userRequests.stream().
forEach(userRequest->
{
UserData=userRepository.findById(userRequest.getId()); //fine
if (CollectionUtils.isNotEmpty(countriesList) && countriesList.contains(userRequest.getCountryId()))//getting NPE here
{
//do some operation
}
});
我尝试通过评估单个语句来进行调试。
我已经确定countriesList 有一些数据
第一部分 CollectionUtils.isNotEmpty(countriesList) 正在返回 true。
userRequest 也不为空,但 userRequest.getCountryId() 为空。
当我评估countriesList.contains(userRequest.getCountryId()) 时,我在这里得到Null pointer exception。为什么不false?
我很困惑我做错了什么。
默认的list.contains(null) 行为只是这样还是因为我在stream() 中调用它?
为了简单起见,我创建了简单的列表并与null进行了比较。
class Test {
public static void main(String[] args) {
List<Long> longList = List.of(1L, 2L, 3L);
System.out.println("Comparing long list with null::" + longList.contains(null));
}
}
这是我得到的例外:
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:222)
at java.base/java.util.ImmutableCollections$AbstractImmutableList.indexOf(ImmutableCollections.java:166)
at java.base/java.util.ImmutableCollections$AbstractImmutableList.contains(ImmutableCollections.java:197)
at com.test.Test.main(Test.java:26)
但如果我这样做:
List<Long> longList = new ArrayList<>();
longList.add(1L);
System.out.println("Comparing long list with null::" + longList.contains(null));
为什么要打印false?为什么这里没有NullPointerException?
【问题讨论】:
-
你有更精确的堆栈跟踪吗?你怎么知道哪些东西是空的,哪些不是空的? (这很可能是 Java 设计选择不当的结果,具体取决于您的版本。)
-
@louis-wasserman 更新了问题以包括异常堆栈跟踪和我当前使用的 jdk 版本是
jdk-14.0.2。 -
删除了
[java-8]标签,因为 JDK 14 显然不是 Java 8。
标签: java exception collections nullpointerexception