java.lang.IllegalStateException: null with iterator



出于某种原因,我得到了java.lang.IllegalStateException:null exception来自 以前工作正常的方法。 我不认为我对此进行了任何更改。它只是突然停止工作,它不会在每个条目上抛出错误,只是 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(( 部分。 状态为假,因为它应该。

感谢您的任何帮助。

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

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

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

我建议将逻辑更改为:

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

现在,如果第一个条件为 true(并且调用了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();
}

我不确定您的任务,这段代码可以解决您的问题吗?

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

最新更新