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

我认为如果trash.getEmails() 为空,这将简单地返回,因为没有什么可以迭代,但是在使用空文件夹进行调试时,它会抛出NullPointerException。为什么那行不通?

4

5 回答 5

2

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

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

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

于 2012-04-27T04:56:36.780 回答
0

您的trashvar 是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>); 
于 2012-04-27T04:44:25.480 回答
0

使用org.apache.commons.collections.CollectionUtils

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

    //Your logic.
 }

isNotEmpty() 将检查空列表和空列表。

于 2014-03-20T14:24:46.863 回答
0

始终将防御性编程合并到您的代码中。

无论你在哪里看到一个对象,想一想如果它为空该怎么办,如果它不为空怎么办。

如下所示,您可以实施。

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

检查垃圾是否为空。

于 2012-04-27T04:57:07.447 回答
0

请参考以下线程以获得更好的理解:for each 循环如何防止空列表?

在您的情况下,收集垃圾为null。因此,当您取消引用垃圾时,您会得到一个空指针异常。因此,给您空指针异常的不是空容器,而是导致空指针异常的垃圾(空对象)的取消引用。

于 2015-05-28T05:34:12.963 回答