2017-04-20 129 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

你是對的,但應該解釋什麼是問題,以及爲什麼你的修復工程。像你說的那樣呈現,這看起來有點神奇(你有一個太多的單詞而不是「你宣稱螞蟻是一個局部變量」) –

相關問題