【问题标题】:java.lang.IllegalStateException: null with iteratorjava.lang.IllegalStateException:带有迭代器的 null
【发布时间】:2018-10-11 17:55:13
【问题描述】:

由于某种原因,我收到 java.lang.IllegalStateException: null 异常 以前工作得很好的方法。 我认为我没有对此进行任何更改。它只是突然停止工作,并且不会在每个条目上抛出错误,只是列表中的 4. 。我什至看不出那个条目有什么不同,它具有它应该具有的所有属性。

Iterator<Class> iter = contacts.iterator();

while (iter.hasNext()){
        Class holder = iter.next();
        try {
            if(dateNow.isBefore(holder.getStartDate())){
                iter.remove();
            }if(dateNow.isAfter(holder.getEndDate())){
                iter.remove();
            }else{
                boolean status = checkStatus(holder);
                if(!status){
                    iter.remove();
                }
            }
        }catch (NullPointerException e) {
            //No end-date or start date
            boolean status = checkStatus(holder);
            if(!status){
                iter.remove();
            }
            else if(dateNow.isBefore(holder.getStartDate())){
                iter.remove();
            }
        }
    }

正在引发此错误。 我使用迭代器的唯一原因是我可以在迭代时删除项目

if(!status){
      iter.remove();
       }

是引发错误的特定行,iter.remove() 部分。 status 应该是 false。

感谢您的帮助。

【问题讨论】:

  • 在询问与您遇到的异常相关的问题时。包含异常的堆栈跟踪是一种很好的做法。这很有帮助!

标签: java iterator illegalstateexception


【解决方案1】:

您的代码中有一个 IF 和一个 IF-ElSE,这是有意的还是您错过了“else”?如果没有这个“else”,您可能会在迭代中多次调用 iter.remove()。

        **if(dateNow.isAfter(holder.getEndDate())){
            iter.remove();
        **

【讨论】:

    【解决方案2】:

    看起来您可能试图从迭代器中删除同一个元素两次。

    我建议将逻辑更改为:

            if (dateNow.isBefore(holder.getStartDate())) {
                iter.remove();
            } else if (dateNow.isAfter(holder.getEndDate())) { // notice the change here
                iter.remove();
            } else {
                boolean status = checkStatus(holder);
                if(!status){
                    iter.remove();
                }
            }
    

    现在,如果第一个条件为真(并且调用了iter.remove()),则不会执行else 子句。

    我还建议避免使用NullPointerException 而不是抓住它。例如:

        if (holder.getStartDate() != null && dateNow.isBefore(holder.getStartDate())){
            iter.remove();
        } else if(holder.getEndDate() != null && dateNow.isAfter(holder.getEndDate())){
            iter.remove();
        } else if (!checkStatus(holder)) {
            iter.remove();
        }
    

    【讨论】:

      【解决方案3】:

      我不确定你的任务,这段代码能解决你的问题吗?

      contacts.stream().filter(x -> {
                  if (dateNow.isBefore(holder.getStartDate()) || dateNow.isAfter(holder.getEndDate()) ){
                      return false;
                  }
                  boolean status = chackStatus(x);
                  if (!status){
                      return false;
                  }
                  return true;
              }).collect(Collectors.toList());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-02
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-20
        • 2016-05-01
        • 2014-01-18
        • 2018-12-20
        相关资源
        最近更新 更多