2017-04-20 176 views
0

我正在首次使用Java中的优先级队列,而且我无法理解我正在做什么导致异常。我试图对旅行商问题实施蚁群类型解决方案。以下是为我的AntColony类调用的唯一代码。PriorityQueue 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)); 
    } 
    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 
+1

你能分享你得到的异常吗? – fiskra

+0

看起来你没有在你的'nextMove'方法或类级别声明'ants'。 – alayor

+0

可能的重复[什么是NullPointerException,以及如何解决它?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it ) –

回答

3

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

你需要改变你的构造函数有:

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

你可以仅仅删除您AntColony构造的PriorityQueue声明。

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

UPDATE:原因为您NullPointerException是,你是不是在初始化你的构造你的ants财产,但要创建一个新的本地ants代替。因此nextMove方法中的ants对象与您在类级别声明中提供的值相同,可能是null

+1

你是对的,但应该解释什么是问题,以及为什么你的修复工程。像你说的那样呈现,这看起来有点神奇(你有一个太多的单词而不是“你宣称蚂蚁是一个局部变量”) –

相关问题