我第一次使用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();
}


我随后作为测试运行的代码如下(仅在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

最佳答案

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

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

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

关于java - PriorityQueue poll()抛出NullPointerException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43522287/

10-10 08:16