簡體   English   中英

java.lang.IllegalStateException:帶有迭代器的null

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM