根据documentation,List.contains
可以在此方案中抛出NullPointerException
:
“如果指定的元素为null并且 此列表不支持null 元素(可选)。“
我只是想到一个不允许空值的List实现,但我不知道。例如,我可以拥有ArrayList<Double>
,但它允许空值。
List<Double> list = new ArrayList<Double>();
if (list.contains(null)) { // this won't throw NPE
}
这里的文档是指这个接口的自定义实现,还是有一些扩展List
的本地JAVA集合类不允许使用null元素?我意识到异常是可选的,我只是想到一个可能发生这种情况的真实案例。
答案 0 :(得分:5)
它指的是自定义实现,直到其中一个Java List实现不允许为null,然后它也将引用它。
答案 1 :(得分:5)
并非List&lt; ...&gt;的所有实现允许元素为null。
一个例子是RoleList::add(role)
,它在添加Null值时抛出异常。
本文档为您做好准备,鼓励您检查您正在使用的任何列表的文档,以确定是否存在问题,或者如果您无法检查,则要小心谨慎。追踪NPE并不好玩。了解文档(提供良好的文档)可以避免很多麻烦。
答案 2 :(得分:2)
Guava的ImmutableList
不允许为null,但在contains(null)
上返回false。
答案 3 :(得分:1)
---发表评论以回应评论---
基本上它的原因是提醒你抓住NullPointerExcepton
,因为List
接口的设计者设想了可能会将任何null
访问报告为错误的列表。
---原帖后续---
标准Java库提供的支持null,但是创建一个不支持java.util.List
的{{1}}的类没有限制。
如果列表不支持null
,则检查null
等同于错误,因此异常可能有意义,具体取决于实施null
的人员。这就是接口必须提到已检查异常的原因;因为,如果没有,那么如果你想确保没有人用List
触及列表,你就不能从子类中抛出NullPointerException
。
答案 4 :(得分:1)
CheckedList将是标准API中不支持空值的List的示例。