2017-04-20 2 views
0

Je travaille avec une file d'attente prioritaire en Java pour la première fois et je ne peux pas, pour la vie de moi, comprendre ce que je fais qui mène à l'exception. J'essaye de mettre en application une solution de type de fourmi de colonie au problème de voyageur de commerce. Ce qui suit est le seul code appelé pour ma classe AntColony.PriorityQueue poll() lancer 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(); 
} 

Le code que j'exécute juste après comme test est le suivant (juste dans une méthode principale).

AntColony a = new AntColony(p); 
a.nextMove(); 

Le a.nextMove() lance une NullPointerException à la partie ants.poll(), mais encore si je change le constructeur à (à des fins de débogage)

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; 
} 

puis juste faire

AntColony a = new AntColony(p); 

Je ne reçois pas d'exception. J'ai du mal à comprendre comment je reçois une exception de ants.poll(), mais quand je l'appelle du constructeur, tout fonctionne. Toute aide avec ceci serait appréciée. Il y a beaucoup de code pour diverses choses dans ce projet, donc je ne pensais pas que le télécharger aiderait tout le monde alors faites moi savoir s'il y a quelque chose que je devrais inclure, mais je ne vois pas comment le problème pourrait sortir de ces deux de code.

Ajouté: exception réelle

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

Pourriez-vous partager l'exception que vous obtenez? – fiskra

+0

Il semble que vous n'avez pas déclaré 'ants' dans votre méthode' nextMove' ou au niveau de la classe. – alayor

+0

Copie possible de [Qu'est-ce qu'une exception NullPointerException, et comment la réparer?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it –

Répondre

3

La variable ants dans votre constructeur AntColony est une variable locale. Ainsi, lorsque vous quittez le constructeur, il n'existe plus. Apparemment, la variable ants que votre méthode nextMove appelle est membre de la classe.

Vous devez changer votre constructeur d'avoir:

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

Vous pouvez simplement supprimer la déclaration PriorityQueue dans votre constructeur AntColony.

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

MISE À JOUR: La cause de votre NullPointerException est que vous n'êtes pas Initialiser votre ants propriété dans votre constructeur, mais vous créez une nouvelle ants locale à la place. Donc l'objet ants dans la méthode nextMove a la même valeur que celle que vous avez fournie dans votre déclaration de niveau classe, qui est probablement null.

+1

Vous avez raison mais vous devez expliquer quel est le problème et pourquoi votre correctif fonctionne. Présenté comme vous l'avez dit, il semble un peu magique (vous avez un mot de trop au lieu de "vous avez déclaré les fourmis comme variable locale") –