PriorityQueue poll() 抛出 NullPointerException

PriorityQueue poll() throwing NullPointerException

我是第一次在 Java 中使用优先级队列,但我终其一生都无法理解我在做什么导致了异常。我正在尝试针对旅行推销员问题实施蚁群式解决方案。以下是为我的 AntColony class.

调用的唯一代码
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();
}

之后我运行作为测试的代码如下(只是在一个main方法中)

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

AntColony 构造函数中的 ants 变量是局部变量。所以当你退出构造函数时,它就不再存在了。显然,您的 nextMove 方法正在调用的 ants 变量是 class 成员。

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

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

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

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

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