如何解决java.util.NoSuchElementException

时间:2013-10-29 18:24:56

标签: java for-loop arraylist hashmap set

我首先得到以下代码

带有以下错误消息

java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextEntry(HashMap.java:894)
        at java.util.HashMap$KeyIterator.next(HashMap.java:928)
        at ca.on.oicr.pinery.lims.gsle.GsleClient.getOrders(GsleClient.java:720)

第720行是循环的第二个。

我得到的答案是我在一个循环中添加订单,循环遍历订单元素,这就是导致异常的原因。不要修改在循环内循环的集合。与样品一样。

所以我重新做了这个方法,但是收到以下错误信息:

java.util.NoSuchElementException
java.util.NoSuchElementException
    at java.util.ArrayList$Itr.next(ArrayList.java:794)
    at ca.on.oicr.pinery.lims.gsle.GsleClient.getOrders(GsleClient.java:730)

其中第730行是以下代码中的Set samples = sampleOrderMap.get(it.next(。。getId())

我如何修复此错误消息,并且这个新方法是否具有与原始方法相同的功能,但是我觉得拥有所有这些循环和条件语句都会导致它不起作用。

2 个答案:

答案 0 :(得分:2)

我假设itIterator。 (我这样说是因为你没有发布重现这个的所有源代码,你将来应该这样做。)

因此,每次调用it.next()时,都会推进迭代器。您在前四行中呼叫it.next()三次。因此,如果Iterator中只剩下一个项目,则对it.hasNext()的初始调用将返回true,但您只能在用完项目之前再次调用it.next()。< / p>

while (it.hasNext()) {
    OrderSample nextSample = it.next();
    // blah blah blah
    // use nextSample instead of it.next() in each subsequence instance.
}

答案 1 :(得分:1)

在下面的代码片段中:

 while (it.hasNext()) {
 if (sampleOrderMap.containsKey((it.next().getId()))) { // calling it.next()
    if (it.next().getId() != null) { // again calling it.next() ?
       Set<OrderSample> samples = sampleOrderMap.get(it.next().getId()); //again calling 
       for (OrderSample orderSample : samples) {
          Set<Attribute> attributes = attributeOrderMap.get(orderSample.getId());

 ////............ your code

在每次调用it.next()时,您连续调用iterator.next(),迭代器通过返回一个元素前进。虽然我不确定返回的对象it.next()是什么,但您可以将其分配给集合类型的Object并在while循环中使用它,如下所示:

while (it.hasNext()) {
   Order order = (Order)it.next();  // if Order is your list's type
     if (sampleOrderMap.containsKey((order.getId()))) {
        if (order.getId() != null) {
           Set<OrderSample> samples = sampleOrderMap.get(order.getId());
           for (OrderSample orderSample : samples) {
              Set<Attribute> attributes = attributeOrderMap.get(orderSample.getId());