web-dev-qa-db-fra.com

java.util.NoSuchElementException utilisant l'itérateur dans java

J'essaie de parcourir une liste en utilisant l'itérateur sur ma liste de journaux. L'objectif est de rechercher un journal contenant le même numéro de téléphone, le même type et la même date que le nouveau journal

Cependant, j'obtiens une exception Java.util.NoSuchElementException dans mon instruction conditionnelle. Quelqu'un sait-il ce qui pourrait causer le problème?

Mon code

public void addLog(String phonenumber, String type, long date, int incoming, int outgoing)
{
    //Check if log exists or else create it.
    Log newLog = new Log(phonenumber, type, date, incoming, outgoing);

    //Log exists
    Boolean notExist = false;

    //Iterator loop
    Iterator<Log> iterator = logs.iterator();


    while (iterator.hasNext())
    {
        //This is where get the exception
        if (iterator.next().getPhonenumber() == phonenumber  && iterator.next().getType() == type && iterator.next().getDate() == date)
        {

            updateLog(newLog, iterator.next().getId());
        }
        else
        {   
            notExist = true;
        }

    }

    if (notExist)
    {
        logs.add(newLog);
    }

}
13
Frederikkastrup

Vous appelez next() plusieurs fois en une seule itération forçant le Iterator à se déplacer vers un élément qui n'existe pas.

Au lieu de

if (iterator.next().getPhonenumber() == phonenumber  && iterator.next().getType() == type && iterator.next().getDate() == date)
{
    updateLog(newLog, iterator.next().getId());
    ...

Utilisation

Log log = iterator.next();

if (log.getPhonenumber() == phonenumber  && log.getType() == type && log.getDate() == date)
{
    updateLog(newLog, log .getId());
    ...

Chaque fois que vous appelez Iterator#next(), il déplace le curseur sous-jacent vers l'avant.

44