【问题标题】:NullPointerException on iterating through empty container in java在 java 中遍历空容器时出现 NullPointerException
【发布时间】:2012-04-27 04:39:27
【问题描述】:
public void clearTrash()
{
    for (Email i1 : trash.getEmails()) trash.removeEmail(trash.getEmails().indexOf(i1));
}

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

【问题讨论】:

  • 您检查垃圾对象是否为空?
  • 能否提供详细的堆栈跟踪信息?另外,如果您可以提供 removeEmail() 的来源,那将很有用。

标签: java nullpointerexception


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您的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>); 
    

    【讨论】:

      【解决方案3】:

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

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

      如下,你可以实现。

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

      检查垃圾是否为空。

      【讨论】:

      • 如果你可以有一个 else 本身,而不是 else。
      【解决方案4】:

      使用org.apache.commons.collections.CollectionUtils

       if(CollectionUtils.isNotEmpty(trash.getEmails()){
      
          //Your logic.
       }
      

      isNotEmpty() 将检查 null 以及空列表。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-05
          • 2016-02-08
          • 1970-01-01
          • 1970-01-01
          • 2015-06-29
          • 1970-01-01
          相关资源
          最近更新 更多