我第一次使用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
答案 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
。