首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么list.contains( null )抛出空指针异常?

为什么list.contains( null )抛出空指针异常?
EN

Stack Overflow用户
提问于 2022-01-24 18:34:22
回答 1查看 2.5K关注 0票数 1

我有List<Long> countriesList,它包含Long值,这些值是国家ids。

现在,我正在使用List<UserRequests>迭代一些streams列表。

代码语言:javascript
复制
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)正在返回trueuserRequest也不是null,但是userRequest.getCountryId()是null。当我评估countriesList.contains(userRequest.getCountryId())时,我得到的是Null pointer exception。为什么不是false?我搞不懂我做错了什么。默认的list.contains(null)行为仅仅是这样还是因为我在stream()中调用它

为了简化起见,我创建了简单列表,并与null进行了比较。

代码语言:javascript
复制
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));
    }
}

这是我得到的例外:

代码语言:javascript
复制
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)

但如果我这么做了

代码语言:javascript
复制
    List<Long> longList = new ArrayList<>();
    longList.add(1L);
    System.out.println("Comparing long list with null::" + longList.contains(null));

为什么要打印false?为什么这里没有NullPointerException

EN

回答 1

Stack Overflow用户

发布于 2022-01-24 19:14:45

来自java.util.List的API文档

一些list实现对它们可能包含的元素有限制。例如,一些实现禁止空元素,而有些实现对其元素的类型有限制。试图添加不合格的元素会引发未经检查的异常,通常为NullPointerException或ClassCastException。试图查询不合格元素的存在可能会引发异常,或者只返回false;一些实现将显示前一种行为,而另一些则会显示后者。更普遍的情况是,尝试对不合格元素的操作(其完成不会导致将不合格元素插入列表)可能会抛出异常,或者在实现选项时成功。此类异常在此接口规范中标记为“可选”。布尔包含(对象o) 如果此列表包含指定的元素,则返回true。更正式地说,返回true的当且仅当这个列表包含至少一个元素e,使得Objects.equals(o,e)。 具体如下: 包含在接口集合中 参数: 元素,其在此列表中的存在将被测试。 返回: 如果此列表包含指定的元素,则为true。 抛出: ClassCastException -如果指定元素的类型与此列表不兼容(可选) NullPointerException -如果指定的元素为空且此列表不允许空元素(可选)

您的countriesList似乎是一种列表类型,它不接受null元素,例如List.ofList.copyOf生成的元素

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

https://stackoverflow.com/questions/70838768

复制
相关文章

相似问题

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