0

次の while ループがあります。this.boatTripsList.iterator().hasNext() を while ループ条件に入れると、エラーがスローされます。イテレータを作成してwhileループ条件を入れると、それが機能します。どうしてこれなの?ありがとうございます。それでは、お元気で。(2 番目のバージョンではエラーがスローされます)

 public Journey(List<BoatTrip> trips) {
   this.boatTripsList = new LinkedList<BoatTrip>();
   Iterator<BoatTrip> iterator = trips.iterator();
   //add the given boat trips to the boattrips list
    while (iterator.hasNext()) {
         BoatTrip thistrip = iterator.next();
         this.boatTripsList.add(thistrip);
    }
}



public Journey(List<BoatTrip> trips) {
   this.boatTripsList = new LinkedList<BoatTrip>();
   //add the given boat trips to the boattrips list
    while (trips.iterator().hasNext()) {
         BoatTrip thistrip = iterator.next();
         this.boatTripsList.add(thistrip);
    }
}
4

4 に答える 4

14

これは正常です。while 条件が の場合、毎回新しい反復子while(trips.iterator().hasNext())を作成します。リストが空でない場合、条件は常に真になります...

ループ自体では、ループに入る前に作成したイテレータを使用します...その結果、NoSuchElementExceptionこのイテレータが空の場合に取得されます。

使用する:

final Iterator<Whatever> = list.iterator();
Whatever whatever;

while (iterator.hasNext()) {
     whatever = iterator.next();
     // do whatever stuff
}

ただし、ウォーキング リストの場合は、foreach ループが優先されます。

for (final BoatTrip trip: tripList)
    // do whatever is needed

また、リストの内容を別のリストに追加する場合は、次を使用します.addAll()

// no need for the "this" qualifier, there is no name conflict
boatTripList.addAll(trips);
于 2013-06-17T08:39:58.283 に答える
1

コードの最初の行で要求したものを使用していませiteratorん。毎回新しいものを要求しているため、常に次のものがあります。

于 2013-06-17T08:40:22.627 に答える
1

.iterator() を呼び出すと、新しい反復子が取得されます。ループ内でこれを行うと、既存の反復子を反復処理するのではなく、常に新しい反復子を取得します。

于 2013-06-17T08:40:56.597 に答える
0

this.boatTripsList.iterator().hasNext() は間違っています

this.boatTripsList.hasNext() は正しい

于 2013-06-17T08:40:57.920 に答える