数组列表中的空指针异常

时间:2014-01-02 08:27:45

标签: java arraylist

ArrayList<String> list1=new ArrayList<String>();
list1=object.getsomeFiles();

getsomeFiles()包含一些代码,如果存在则返回文件名或返回null

我检查了

if(list1!=null&&!list1.isEmpty())

但仍然会引发NullPointerException

当我进行调试时,我发现list1保持null值。

8 个答案:

答案 0 :(得分:3)

&会破坏Short-circuit evaluation,而是使用&&


<强>解释

如果你有:

if(a() & b())

然后 ab将被执行,最终结果将被评估。

但如果你有:

if(a() && b())

如果a()false,则b() 将不会

答案 1 :(得分:2)

“object”实例为null。

ArrayList<String> list1=new ArrayList<String>();
if(Object!=null){
    list1=object.getsomeFiles();
    if(list1!=null&&!list1.isEmpty()){
        // Your code here
    }
}

答案 2 :(得分:1)

if(list1!=null&!list1.isEmpty())更改为if(list1!=null&&!list1.isEmpty())

short-circuit(like &&),如果没有必要,请不评估右侧。作为一个例子,如果&amp;&amp;左手边是假的,没有必要评估右手边的一面。换句话说||如果左边是真的,则无需评估右手边的一个。因此,如果listnull,则部分的其余部分将无法评估。

non-short(like &)总是评估双方。所以你会得到NullPointerException

答案 3 :(得分:1)

问题是,如果您使用&检查两个条件,则无论第一个语句是true还是false,都会评估这两个语句。如果第一个是false,则评估第二个结果为NullPointerException。要解决这个问题,您应该是&&运营商。它仅在第一个表达式为真时评估第二个表达式,仅当list1不是null时才会计算。

因此,if里面的正确条件应该是

list1 != null && !list1.isEmpty()

答案 4 :(得分:1)

正如其他人所回答的那样,将&更改为&&

问题是由于&&&之间存在差异。

例如

 if (A==B && B==C) 

首先jvm评估A == B,如果错误退出,则为

 if (A==B & B==C) 

第一个JVM评估A==B如果false或者真的JVM也评估B==C

这是一个名为“short-circuited”的

的Java规范

请参阅Difference between & and &&

答案 5 :(得分:0)

&条件

中将单&&替换为双if

这个

if(list1!=null&!list1.isEmpty())

应该是

if(list1!=null && !list1.isEmpty())

&&是合乎逻辑的,即真实&amp;&amp;是真的,其他一切都是假的。 而&是按位和。

答案 6 :(得分:0)

使用&&代替&

if(list1!=null && !list1.isEmpty())

答案 7 :(得分:0)

所有答案都很好地解释了&&&

但是,在您修改后仍然会收到NullPointerException,那么问题就是您要调用object方法的 null getsomeFiles()

list1=object.getsomeFiles();
       ↑ //null  

如果你有

代码
SomeFileClass object; //here object is null

确保object初始化为:

object = new SomeFileClass();

或在对象创建时初始化

SomeFileClass object = new SomeFileClass();

来自Java docs NullPointerException

当应用程序在需要对象的情况下尝试使用null时抛出。其中包括:

  • 调用null对象的实例方法。
  • 访问或修改空对象的字段。
  • 将null的长度视为数组。
  • 访问或修改null的插槽,就像它是一个数组一样。
  • 抛出null,就像它是Throwable值一样。