Java 为什么如果我将列表实例化为null,它会失败

Java 为什么如果我将列表实例化为null,它会失败,java,list,nullpointerexception,Java,List,Nullpointerexception,很多时候我不得不使用对象列表而不是对象,如果我使用 MyObj a = null; a.setParameter = 0; List<MyObj> a = null; MyObj b = getObjectFromSomewhere(); a.add(b); 它起作用了。 但是如果我使用 MyObj a = null; a.setParameter = 0; List<MyObj> a = null; MyObj b = getObjectFromSomewhere

很多时候我不得不使用对象列表而不是对象,如果我使用

MyObj a = null;
a.setParameter = 0;
List<MyObj> a = null;
MyObj b = getObjectFromSomewhere();
a.add(b);
它起作用了。 但是如果我使用

MyObj a = null;
a.setParameter = 0;
List<MyObj> a = null;
MyObj b = getObjectFromSomewhere();
a.add(b);
列表a=null;
MyObj b=getObjectFromSomewhere();
a、 添加(b);
它失败并出现错误:java.lang.NullPointerException

我怎样才能知道我的新
列表a
是“null”还是里面没有任何元素

列表是您必须将元素放入其中的容器。在将任何内容放入列表之前,列表必须存在(因此,请注意,您可以有一个空列表)

因此:

List<MyObj> a = null;
列表a=null;
声明一个指向null的变量-不是实际的容器。尝试:

List<MyObj> a = new ArrayList<>();
List a=new ArrayList();
(请注意,列表有不同的种类,具有不同的性能特征,以上只是选择用于说明的常用种类)

(为了解决您的第一个问题,我想这是一个静态方法,是为类定义的,而不是为类的实例定义的,Java会让您通过一个实例引用它。)

列表是一个必须将元素放入其中的容器。在将任何内容放入列表之前,列表必须存在(因此,请注意,您可以有一个空列表)

因此:

List<MyObj> a = null;
列表a=null;
声明一个指向null的变量-不是实际的容器。尝试:

List<MyObj> a = new ArrayList<>();
List a=new ArrayList();
(请注意,列表有不同的种类,具有不同的性能特征,以上只是选择用于说明的常用种类)


(为了解决您的第一个问题,我想这是一个静态方法,是为类定义的,而不是为类的实例定义的,Java会让您通过实例引用它)

Eclipse允许您将其初始化为null,因为Eclipse认为您将在代码中稍后的某个地方将对象指向该引用


因此,您有责任让它在使用任何列表方法之前引用对象。

Eclipse允许您将其初始化为null,因为Eclipse认为您将在代码中稍后的某个地方将对象指向该引用

因此,您有责任让它在使用任何列表方法之前引用对象。

这样做
List a=null
不会在内存中进行初始化,因此
a
指向空

你应该做的是

List<MyObj> a = new ArrayList<>();
a.add(getObjectFromSomewhere());
请记住,当
a
null
时调用
a.size()
将抛出
NullPointerException
执行此操作
列表a=null
不会在内存中进行初始化,因此
a
指向零

你应该做的是

List<MyObj> a = new ArrayList<>();
a.add(getObjectFromSomewhere());

请记住,当
a
null
时调用
a.size()
将引发
NullPointerException

我猜
a.setParameter
是MyObj的静态字段,否则也会引发null指针异常。可以很好地赋值给null(它用新值覆盖旧值),但不能调用null对象上的函数,因为它需要一个实例来操作(除非它是一个静态函数,它绕过引用类的任何实例)。我猜
a.setParameter
是MyObj的一个静态字段,否则也会引发空指针异常。可以很好地赋值给null(它用新值覆盖旧值),但是不能调用null对象上的函数,因为它需要一个实例来操作(除非它是一个静态函数,它绕过了类的任何实例),那么为什么Eclipse允许我们对list=null进行赋值呢?重点是什么?任何对象引用都可以是null,注意,列表只是一个对象。然而,我同意空列表是令人困惑的,我通常更喜欢空列表,这样我就不必在迭代之前检查它了。@LizLamperouge“那么为什么Eclipse允许我们用列表=空?这有什么意义呢?”这两个
null
概念的发明者都不知道@BrianAgnew谢谢你的回答,最后我使用if(a.isEmpty())来查看列表是否为空。现在我非常理解“空”的含义。(也要感谢Timothy Truckle)那么为什么Eclipse允许我们对list=null进行istantiate呢?重点是什么?任何对象引用都可以是null,注意,列表只是一个对象。然而,我同意空列表是令人困惑的,我通常更喜欢空列表,这样我就不必在迭代之前检查它了。@LizLamperouge“那么为什么Eclipse允许我们用列表=空?这有什么意义呢?”这两个
null
概念的发明者都不知道@BrianAgnew谢谢你的回答,最后我使用if(a.isEmpty())来查看列表是否为空。现在我非常理解“空”的含义。(也要感谢Timothy Truckle)当a不是null而是0元素时?我不认为你的答案是正确的,当a不是空的,但是有0个元素?我认为你的答案不对