在java中迭代空容器时出现NullPointerException

时间:2012-04-27 04:39:27

标签: java nullpointerexception

public void clearTrash()
{
    for (Email i1 : trash.getEmails()) trash.removeEmail(trash.getEmails().indexOf(i1));
}

我认为如果trash.getEmails()为空则会返回,因为没有任何内容可以迭代,但是在调试空文件夹时会抛出NullPointerException。为什么不起作用?

5 个答案:

答案 0 :(得分:2)

我不确定这个foreach循环背后的逻辑是什么,但我建议您在迭代时使用Iterator删除项目,即:

Iterator<Email> it = trash.iterator();
while (it.hasNext()) {
    // some logic ....
    it.remove();
}

至于您的NPE,可能trashtrash.getEmails()可能为空。检查空值!

答案 1 :(得分:0)

您的trash var为null或列表trash.getEmails()为空

所以当你使用它时,它就像

for(Email i1 : null)

在使用之前,请尝试使用它来评估您的列表:

if (trash != null) {
    //some logic here...
    if (trash.getEmails() != null) {
        for(Email i1 : null) {
            //your code...
        }
    }
}

另外,作为旁注,创建新列表而不是删除所有元素会更好。

//deleting the items in the List<Email>
//maybe the collection is not List, just a supposition, still the idea is the same
trash.setEmails(new List<Email>); 

答案 2 :(得分:0)

始终将Defensive programming合并到您的代码中。

无论你在哪里看到一个对象,都要想想如果它是null就该怎么办,如果它不是null,那该怎么办。

如下所示,您可以实施。

    if(object==null){
    //doSomething()
    }else{
//doSomethingElse()
    }

检查垃圾是否为空。

答案 3 :(得分:0)

使用org.apache.commons.collections.CollectionUtils

 if(CollectionUtils.isNotEmpty(trash.getEmails()){

    //Your logic.
 }

isNotEmpty()将检查null和空List。

答案 4 :(得分:0)

请参阅以下主题以获得更好的理解:How does a for each loop guard against an empty list?

在您的情况下,收集垃圾是 null 。因此,当您取消引用垃圾时,您会收到空指针异常。所以它不是空容器,它给你空指针异常,而是解除引用trash(null对象),导致空指针异常。