为了账号安全,请及时绑定邮箱和手机立即绑定

java.lang.IllegalStateException: null with

java.lang.IllegalStateException: null with

吃鸡游戏 2021-11-11 16:06:56
出于某种原因,我从之前运行良好的方法中收到 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 是错误的,这是应该的。
查看完整描述

3 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2021-11-11
?
GCT1015

TA贡献1827条经验 获得超4个赞

看起来您可能试图从迭代器中删除相同的元素两次。


我建议将逻辑更改为:


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

    }


查看完整回答
反对 回复 2021-11-11
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

我不确定你的任务,这段代码能解决你的问题吗?


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


查看完整回答
反对 回复 2021-11-11
  • 3 回答
  • 0 关注
  • 354 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信