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