2016-03-29 12 views
1

Ich versuche, ein Diagramm in Java zu implementieren, das arrayList von arrayList verwendet.Java Graph Implementierung: nullpointerexception

Ich bekomme immer eine NullPointerException immer wenn die addEdge Funktion aufgerufen wird. Ich kann nicht herausfinden, warum.

Hier ist mein Code:

import java.util.ArrayList; 

public class Graph { 

    private static ArrayList<ArrayList<Integer>> adjList; 

    public Graph(int vertices){ 
     ArrayList<ArrayList<Integer>> adjList = new ArrayList<ArrayList<Integer>>(); 
     for(int i = 0; i < vertices; i++){ 
      adjList.add(new ArrayList<Integer>()); 
     } 
    } 

    public void addEdge(int source, int destination){ 
     adjList.get(source).add(destination); 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Graph g = new Graph(4); 
     g.addEdge(0, 1); 
     g.addEdge(0, 2); 
     g.addEdge(1, 2); 
     g.addEdge(2, 0); 
     g.addEdge(2, 3); 
     g.addEdge(3, 3); 

     System.out.println("Neighbors of vertex 0: " + adjList.get(0)); 
     System.out.println("Neighbors of vertex 2: " + adjList.get(2)); 
    } 
} 

Bitte raten Sie freundlich.

+3

Mögliche Duplikat [Was für eine Null-Zeiger-Ausnahme ist, und wie kann ich es beheben?] (Http://stackoverflow.com/questions/218384/ what-is-a-null-Zeiger-Ausnahme-und-wie-mache-ich-fix-it) – soorapadman

Antwort

0

Sie sollten static in adjList Feld Erklärung entfernen.

Dieser Modifikator macht adjList eine statische Instanz, die sich auf null bezieht. Und im Konstruktor instanziieren Sie den Wert für einen anderen adjList, der für Ihren Konstruktor lokal ist (und nach dem Aufruf des Konstruktors per GC erfasst werden muss). Es ist zwei völlig unterschiedliche Variablen mit dem gleichen Name

2

In Ihrem Graph Konstruktor, du bist nicht initialisiert das static Mitglied adjList, sondern ein lokales mit demselben Namen definieren. Außerdem muss adjList nicht static sein, da es unter allen Instanzen von Graph geteilt wird.

Passen Sie es an:

private ArrayList<ArrayList<Integer>> adjList; 

public Graph(int vertices){ 
    adjList = new ArrayList<ArrayList<Integer>>(); 
    ... 
} 
0

Änderung Konstruktor so, dass Sie nicht eine lokale adjList Variable

public Graph(int vertices){ 
    adjList = new ArrayList<ArrayList<Integer>>(); 
    for(int i = 0; i < vertices; i++){ 
     adjList.add(new ArrayList<Integer>()); 
    } 

} 

Auch machen diese adjList Variable nicht statisch deklarieren, da Sie die adjList wollen einzigartig sein zu jedem Diagramm und nicht über alle geteilt

private ArrayList<ArrayList<Integer>> adjList; 
0

In der Graph-Konstrukt Oder Sie deklarieren eine adjList-Variable, die in Konflikt mit Ihrer statischen Klasse steht. Sie ersetzen sollte

public Graph(int vertices){ 
     ArrayList<ArrayList<Integer>> adjList = new ArrayList<ArrayList<Integer>>(); 
     for(int i = 0; i < vertices; i++){ 
      adjList.add(new ArrayList<Integer>()); 
     } 

    } 

von

public Graph(int vertices){ 
     adjList = new ArrayList<ArrayList<Integer>>(); 
     for(int i = 0; i < vertices; i++){ 
      adjList.add(new ArrayList<Integer>()); 
     } 

    }