如果我正在撰写代码
List<String> list1 = new ArrayList<String>();
list1.add(null);
list1.add(null);
Java允许这样做。为什么?
任何使用list1 [0]的方式都将导致NPE。
Java允许这样做。为什么?
因为List
是对象引用的集合。由于对于所有类型来说null
都是一个有效的引用,所以编译器允许这样的语句: list1.add(null)
首先,你不能像array
那样访问list
元素,例如list1[0]
,如果你想从list
中访问,你需要写成list.get(0)
;
针对你真正的问题,它不会导致NPE,并且列表允许你向其中添加null
。当你尝试返回时,它仅返回null
。
如果你试图在结果为null
的对象上调用方法/变量,则会遇到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
,表示它们目前不包含对象引用。
在语义上,包含一个 null
条目的 List
与完全没有该位置条目的 List
是不同的。完全没有一个条目可能很容易与在特定位置有一个带有 null
的条目或一个非 null
条目具有不同的含义。
ArrayList
允许使用null
元素,
实现了所有可选的列表操作,并允许包括null在内的所有元素。
但是并不保证其他实现也一定允许。
例如,Java9 List.of()
不允许使用null
元素。:
它们不允许使用null元素。试图使用null元素创建它们会导致NullPointerException异常。
另请参阅Collection
javadoc:
某些集合实现对其可能包含的元素有限制。例如,某些实现禁止null元素,而某些实现则对其元素的类型有限制。尝试添加不合格的元素会抛出未经检查的异常,通常为NullPointerException或ClassCastException。
list.add()
都抛出异常会怎样吗?哦,等等,List.of(...)
就是这样的。摇头。 - Josh M.