PriorityQueue poll()抛出NullPointerException

时间:2017-04-20 14:24:55

标签: java priority-queue traveling-salesman

我第一次使用Java中的优先级队列而且我不能理解我正在做的事情导致异常。我试图为旅行商问题实施蚁群式解决方案。以下是为我的AntColony类调用的唯一代码。

public AntColony(TSPInstance p) {
    PriorityQueue<Ant> ants = new PriorityQueue<Ant>(new AntComparator());
    size = p.getDimension();
    for (int i = 0; i < size; i++) {
        ants.offer(new Ant(p));
    }
    shortestTour = Integer.MAX_VALUE;
}

public void nextMove() {
    ants.poll();
}

我之后运行的代码就像测试一样(仅在主方法中)。

AntColony a = new AntColony(p);
a.nextMove();

a.nextMove()在ants.poll()部分抛出NullPointerException,但是如果我将构造函数更改为(用于调试目的)

public AntColony(TSPInstance p) {
    PriorityQueue<Ant> ants = new PriorityQueue<Ant>(new AntComparator());
    size = p.getDimension();
    for (int i = 0; i < size; i++) {
        ants.offer(new Ant(p));
    }
    ants.poll(); //ADDED THIS
    shortestTour = Integer.MAX_VALUE;
}

然后再做

AntColony a = new AntColony(p);

我没有例外。我很难理解我是如何从ants.poll()获取异常的,但是当我从构造函数中调用它时,一切正常。任何帮助都将不胜感激。在这个项目中有很多代码用于各种各样的事情,所以我并不认为上传它会对任何人都有所帮助,所以如果有我应该包含的内容,请告诉我,但我不知道。看看这两个代码之外的问题是怎么回事。

已添加:实际例外

Exception in thread "main" java.lang.NullPointerException
at data_structures.AntColony.nextMove(AntColony.java:25) (the ants.poll() part)
at algorithms.ACTest.main(ACTest.java:6) The a.nextMove() part

2 个答案:

答案 0 :(得分:3)

ants构造函数中的AntColony变量是一个局部变量。因此,当您退出构造函数时,它不再存在。显然,ants方法正在调用的nextMove变量是类成员。

您需要将构造函数更改为:

    // initialize the class member, not a local instance.
    ants = new PriorityQueue<Ant>(new AntComparator());

答案 1 :(得分:0)

您只需删除PriorityQueue构造函数中的AntColony声明即可。

public AntColony(TSPInstance p) {
    ants = new PriorityQueue<Ant>(new AntComparator());
    size = p.getDimension();
    ...
}

更新:NullPointerException的原因是您没有在构造函数中初始化ants属性,而是创建新的本地ants。因此,ants方法中的nextMove对象与您在类级别声明中提供的值相同,可能是null