0

我有以下 while 循环,如果我将 this.boatTripsList.iterator().hasNext() 放在 while 循环条件中,它会引发错误。当我创建迭代器然后放入while循环条件时,它将起作用。为什么是这样?感谢和问候。(第二个版本抛出错误)

 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 回答