java.lang.IllegalStateException: null with iterator
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 是 false,这是应该的。
感谢您的帮助。
看起来您可能试图从迭代器中删除同一个元素两次。
我建议将逻辑更改为:
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());
出于某种原因,我收到 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,这是应该的。
感谢您的帮助。
看起来您可能试图从迭代器中删除同一个元素两次。
我建议将逻辑更改为:
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());