![](/img/trans.png)
[英]java.lang.IllegalStateException: Iterator already obtained
[英]java.lang.IllegalStateException: null with iterator
由于某种原因,我从以前运行良好的方法中获取了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应该是假的。
谢谢你的帮助。
看来您可能要尝试两次从迭代器中删除同一元素。
我建议将逻辑更改为:
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();
}
您的代码中有一个IF和一个IF-ElSE,是想要的还是错过了“ else”? 如果没有这个“ else”,您可能会在一次迭代中多次调用iter.remove()。
**if(dateNow.isAfter(holder.getEndDate())){
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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.