java.lang.IllegalStateException: нуль с итератором - PullRequest
0 голосов
/ 11 октября 2018

По какой-то причине я получаю java.lang.IllegalStateException: пустое исключение из метода, который раньше работал нормально.Я не думаю, что я внес какие-либо изменения в этом.Он просто внезапно перестал работать и не выдает ошибку для каждой записи, кроме той, которая находится в списке 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 ().статус ложный, как и должно быть.

спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

У вас есть один IF и один IF-ElSE в вашем коде, это предназначено, или вы пропустили «еще» там?Без этого «else» вы, скорее всего, будете вызывать iter.remove () чаще, чем один раз за итерацию.

        **if(dateNow.isAfter(holder.getEndDate())){
            iter.remove();
        **
0 голосов
/ 11 октября 2018

Я не уверен в вашей задаче, этот код решает вашу проблему?

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());
0 голосов
/ 11 октября 2018

Похоже, вы пытаетесь удалить один и тот же элемент дважды из итератора.

Я предлагаю изменить логику на:

        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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...