Java LinkedList NoSuchElementException

时间:2011-11-27 20:22:51

标签: java exception linked-list

我有以下方法来评估VRP路由的开销,但它会抛出java.util.NoSuchElementException。

起初我认为问题出现在第一次迭代中,iterator.next()为null,这就是我添加布尔值firstIteration的原因,但问题仍然存在!

private void evaluateRouteCost () {

    ListIterator<VRPNode> iterator = this.routeList.listIterator();

    boolean firstIteration=true;

    while (iterator.hasNext()) {

        if (firstIteration) {
            firstIteration=false;
        }

        else {
            this.routeCost += vrp.distance(iterator.previous(), iterator.next()); 
        }

    }

请注意,routeList是LinkedList。

3 个答案:

答案 0 :(得分:3)

如果firstIteration为真,您仍然需要调用iterator.next()(否则您仍然会在第二次迭代中的第一个元素上)。

然而,我会稍微改写一下:

ListIterator<VRPNode> iterator = this.routeList.listIterator();

while (iterator.hasNext()) {

    VRPNode current = iterator.next();

    if (iterator.hasPrevious())
        this.routeCost += vrp.distance(iterator.previous(), current); 

}

答案 1 :(得分:0)

你在第一个节点上调用.previous。另外:您可以将其简化为:

private void evaluateRouteCost () {

    ListIterator<VRPNode> iterator = this.routeList.listIterator();

    boolean firstIteration=true;

    if (iterator.hasNext()) {
      iterator.next();
    }    

    while (iterator.hasNext()) {
        this.routeCost += vrp.distance(iterator.previous(), iterator.next()); 
    }

}

答案 2 :(得分:0)

我用这个简单的方法修复它:

public void evaluateRouteCost () { //http://bit.ly/t76G1Z

    ListIterator<VRPNode> iterator = this.routeList.listIterator();

    while(iterator.hasNext()) {

        int currentId, nextId;

        currentId=iterator.next().getId();

        try {
            nextId=iterator.next().getId();
        }
        catch (NoSuchElementException e) {
            // when reaches the last element
            break;
        }

        this.routeCost += vrp.distance(currentId, nextId);

        iterator.previous();    
    }

}