java.lang.IllegalStateException:带有迭代器的null

时间:2018-10-11 09:11:07

标签: java iterator illegalstateexception

由于某种原因,我正在获取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()部分。状态应该是错误的。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您似乎可能要尝试两次从迭代器中删除同一元素。

我建议将逻辑更改为:

        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();
    }

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我不确定您的任务,此代码是否可以解决您的问题?

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());