web-dev-qa-db-ja.com

javaでイテレータを使用するjava.util.NoSuchElementException

ログのリストに対してイテレータを使用してリストを反復処理しようとしています。目標は、新しいログと同じ電話番号、タイプ、日付を含むログを検索することです

ただし、条件ステートメントでJava.util.NoSuchElementExceptionを受け取ります。誰が問題の原因を知っていますか?

私のコード

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

1回の反復でnext()を何度も呼び出して、Iteratorを存在しない要素に強制的に移動させています。

の代わりに

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

使用する

_Log log = iterator.next();

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

Iterator#next()を呼び出すたびに、基になるカーソルが前方に移動します。

44