2010-04-20 3 views
0

J'essaie de résoudre un labyrinthe par DFS, en utilisant adj List pour représenter les sommets et les arêtes du graphique. Au total, il y a 12 nœuds (3 lignes [A, B, C] * 4 cols [0, .., 3]). Mon programme commence par sauvegarder toutes les étiquettes de vertex (A0, .. C3), jusqu'ici tout va bien, puis vérifie les nœuds adjacents, aussi aucun problème, si le mouvement est possible, il continue à créer le bord, ici c'est où tout va mal .ArrayList <String> NullPointerException

adjList[i].add(vList[j].label); 

I utilisé le débogueur et a constaté que vList[j].label est non nulle, il contient une chaîne correcte (ie. "B1"). Les seules variables qui montrent null sont dans adjList[i], ce qui me porte à croire que je l'ai mis en œuvre à tort. C'est comme ça que je l'ai fait.

public class GraphList { 
    private ArrayList<String>[] adjList; 
    ... 
    public GraphList(int vertexcount) { 
     adjList = (ArrayList<String>[]) new ArrayList[vertexCount]; 
     ... 
    } 
    ... 
    public void addEdge(int i, int j) { 
     adjList[i].add(vList[j].label); //NULLPOINTEREXCEPTION HERE 
    } 
    ... 
} 

Je vais vraiment apprécier si quelqu'un peut me pointer sur la bonne voie pour ce qui va mal ... Merci!

+1

Ce que vous devez faire est de changer le code pour avoir une instruction par ligne. adjList [i] .add (vList [j] .label); devrait être ArrayList alTmp = adjList [i]; WhateverType vTmp = vList [j]; Chaîne label = vTmp.label; alTmp.add (étiquette); Et puis voir où vous rencontrez le problème avec le débogueur –

Répondre

3

Vous avez créé le groupe, mais vous devez toujours créer et créer les objets ArrayList. Comme il est écrit, adjList[i] renvoie null parce que rien n'a encore été affecté.

+0

@Joel: Serait-il correct de coder cette "adjList [i] .contains (vList [j] .label)" – Carlos

+0

Votre méthode addEdge est très bien. Vous n'initialisez pas vos structures de données correctement. Vous avez besoin d'une boucle avec dans votre constructeur avec 'adjList [i] = new ArrayList ();' Alternativement, vous pouvez modifier addEdge pour tester null et créer le ArrayList s'il n'existe pas encore. – Joel

1

Je vois que vous avez créé le conteneur mais êtes-vous sûr de remplir la liste avec des éléments? Pourquoi ne pas ajouter assert((adjList[i] != null) && (adjList[j] != null)) à addEdge juste pour être sûr que l'un d'entre eux ne sont pas null. Exécuter avec java -ea ...

Questions connexes