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

在java中迭代空容器时出现NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我认为如果trash.getEmails()是空的,这将简单地返回,因为没有可迭代的内容,但在使用空文件夹进行调试时,它会抛出NullPointerException。为什么不起作用呢?您的垃圾变量是null或者列表trash.getEmails()是null 所以当你使用它的时候 public void clearTrash() { for (Email i1 : trash.getEmails()) trash.removeEmail(trash.getEmails().indexO

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

您的
垃圾
变量是
null
或者列表
trash.getEmails()
是null

所以当你使用它的时候

public void clearTrash()
{
    for (Email i1 : trash.getEmails()) trash.removeEmail(trash.getEmails().indexOf(i1));
}
在使用列表之前,请尝试对其进行评估:

for(Email i1 : null)
另外,作为补充说明,创建一个新列表比删除所有元素在性能上更好

if (trash != null) {
    //some logic here...
    if (trash.getEmails() != null) {
        for(Email i1 : null) {
            //your code...
        }
    }
}
//删除列表中的项目
//也许收藏不是列表,只是一个假设,想法还是一样的
垃圾。设置电子邮件(新列表);

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

//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>); 
Iterator it=trash.Iterator();
while(it.hasNext()){
//有些逻辑。。。。
it.remove();
}
至于您的NPE,可能是
垃圾桶
垃圾桶。getEmails()
为空。检查空值

始终将其合并到代码中

无论在何处看到对象,都要考虑如果该对象为null该怎么办,如果该对象不为null该怎么办

如下面所示,您可以实现

Iterator<Email> it = trash.iterator();
while (it.hasNext()) {
    // some logic ....
    it.remove();
}
检查垃圾箱是否为空。

使用


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

请参阅以下线程以更好地理解:


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

你有没有检查垃圾对象是否为空?你能给出详细的堆栈跟踪吗?另外,如果您可以提供removeEmail()的源代码,这将非常有用。如果您可以提供一个else本身,则可以使用它来代替else。
    if(object==null){
    //doSomething()
    }else{
//doSomethingElse()
    }
 if(CollectionUtils.isNotEmpty(trash.getEmails()){

    //Your logic.
 }