如果我正在写作
List<String> list1 = new ArrayList<String>();
list1.add(null);
list1.add(null);
Java允许这样做。为什么? 任何使用list1 [0]都会导致NPE。
答案 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
值。
与集合不同,列表通常允许重复元素。更正式的, 列表通常允许元素对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。