为什么java列表中允许空值

为什么java列表中允许空值,java,list,Java,List,如果我在写作 List<String> list1 = new ArrayList<String>(); list1.add(null); list1.add(null); List list1=new ArrayList(); 列表1.add(空); 列表1.add(空); Java允许这样做。为什么? 任何对列表1[0]的使用都将以任何方式导致NPE 首先,您不能访问列表元素,如list1[0],该语法是从数组访问。若要从列表中访问,需要编写list.get(0)

如果我在写作

List<String> list1 = new ArrayList<String>();
list1.add(null);
list1.add(null);
List list1=new ArrayList();
列表1.add(空);
列表1.add(空);
Java允许这样做。为什么?
任何对列表1[0]的使用都将以任何方式导致NPE

首先,您不能访问
列表
元素,如
list1[0]
,该语法是从
数组
访问。若要从列表中访问,需要编写
list.get(0)

说到您的实际问题,它不会给您NPE,并且列表允许您向其中添加
null
。当您尝试返回时,它只返回
null

如果您试图调用产生的
null
上的方法/变量,则会遇到NPE

Java允许这样做。为什么?

因为
列表是对象引用的集合。由于
null
是一个有效的引用(适用于所有类型),因此编译器允许类似
list1.add(null)

任何对列表1[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 list1=new ArrayList();
列表1.add(空);
字符串foo=list1.get(0);//这里没有NPE
如果(foo==someOtherObject){//Nor在这里
//做点什么
}
List
维护对象引用的列表。对象引用可以是对有效的现存对象的引用,也可以是
null
以指示它们当前不包含对象引用


从语义上讲,包含
null
条目的
List
不同于在该位置根本没有条目的
List
。完全没有条目与在给定位置有一个带有
null
的条目或一个非
null
条目有着不同的含义。

这取决于
列表
的实现。接口本身并不强制执行是否应允许
null

从:

与集合不同,列表通常允许重复元素。更正式地说, 列表通常允许成对的元素e1和e2,以便 e1.equals(e2),如果 完全允许空元素

再次:

一些列表实现对它们所使用的元素有限制 可能包含。例如,某些实现禁止空元素, 有些对元素的类型有限制。企图 添加不符合条件的元素通常会引发未经检查的异常 NullPointerException或ClassCastException

允许
null
元素

实现所有可选的列表操作,并允许所有元素,包括null

但不一定是其他实现

例如,Java9:

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

另见:

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


尝试list1.get(0),它不会给出NPElist1[0]甚至不会编译,因此这个问题就没有多大意义。另外,正如其他人所指出的,正确的列表语法(list1.get(0))不会对null值抛出NPE,而只会返回null。在发布问题之前,请至少做一点调查。。。