java while(LinkedList.iterator()。hasNext())不起作用

时间:2013-06-17 08:38:05

标签: java iterator while-loop

我有以下while循环,如果我在while循环条件中放入this.boatTripsList.iterator()。hasNext(),则会抛出错误。当我创建迭代器然后放入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 个答案:

答案 0 :(得分:13)

这是正常的:如果您的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);

答案 1 :(得分:1)

您没有在代码的第一行使用iterator - 您每次都要申请一个新代码,因此它总是会有下一个代码。

答案 2 :(得分:1)

对.iterator()的调用会获得一个新的迭代器。如果你在循环中这样做,你将总是获得一个新的迭代器,而不是迭代现有的迭代器。

答案 3 :(得分:0)

this.boatTripsList.iterator()。hasNext()错误

this.boatTripsList.hasNext()是正确的