为什么在Java List中允许空值

时间:2015-08-23 09:36:40

标签: java list

如果我正在写作

List<String> list1 = new ArrayList<String>();
list1.add(null);
list1.add(null);

Java允许这样做。为什么? 任何使用list1 [0]都会导致NPE。

5 个答案:

答案 0 :(得分:15)

  

Java允许这样做。为什么呢?

因为List是对象引用的集合。由于null有效引用(适用于所有类型),因此编译器允许使用list1.add(null)等语句

答案 1 :(得分:6)

首先,您无法访问list这样的list1[0]元素,该语法将从array进行访问。如果要从列表中访问,则需要编写list.get(0);

来到你的实际问题,它不会给你NPE,列表允许你添加null。当您尝试返回时,它仅返回null

如果您尝试在null上调用方法/变量,那么您将遇到NPE。

答案 2 :(得分:2)

  

任何使用list1 [0]都会导致NPE。

不,它赢了

List<String> list1 = new ArrayList<String>();
list1.add(null);
String foo = list1.get(0);    // No NPE here
if (foo == someOtherObject) { // Nor here
    // Do something
}

List维护一个对象引用列表。对象引用可以是对有效的现存对象的引用,也可以是null以指示它们当前不包含对象引用。

在语义上List条目中包含null条目的List 与<{1}} 不同进入该职位 at all 。没有条目 at 可能很容易与具有null的条目或在给定位置具有非null条目具有不同的含义。

答案 3 :(得分:1)

这取决于List实施。这样的接口不强制是否允许null值。

来自documentation

  

与集合不同,列表通常允许重复元素。更正式的,   列表通常允许元素对e1和e2这样   e1.equals(e2),如果它们通常允许多个null元素   允许空元素。

再次:

  

某些列表实现对它们的元素有限制   可能含有。例如,某些实现禁止null元素,   有些人对其元素的类型有所限制。尝试   添加不合格的元素通常会抛出未经检查的异常   NullPointerException或ClassCastException。

答案 4 :(得分:1)

ArrayList允许null元素

实施所有可选的列表操作,并允许所有元素(包括null)。

,但不一定是其他实现方式。

例如,Java9 List.of() does not permit null elements.

它们不允许使用null元素。尝试使用null元素创建它们会导致NullPointerException。

另请参见Collection javadoc

某些集合实现对它们可能包含的元素有限制。例如,某些实现禁止使用null元素,而某些实现对其元素类型进行限制。尝试添加不合格元素会引发未经检查的异常,通常为NullPointerException或ClassCastException。