2017-06-04 2 views
0

Ich versuche derzeit, eine Graphenrepresentation eines Spiels zu erstellen, indem ich selbst die Graphklasse erstelle. Der Konstruktor ist dies ein (Hoffnung, die ich habe keine Logik Fehler hier):java.lang.StackOverflowError aufgrund von Iterator in DFS

private int nNodes; 
    private int nEdges; 
    private List<Integer> adj[]; 
    private boolean visited[]; 

    public GameGraph() 
    { 
     nNodes = 81; 
     adj = new LinkedList[nNodes]; 
     for(int i = 0; i < nNodes; i++) 
      adj[i] = new LinkedList(); 
     visited = new boolean[nNodes]; 
    } 

ich überprüfen, ob es ein Weg zwischen einer Quelle und dem Ziel besteht darin, den Tiefensuche-Algorithmus. Das ist, was ich schrieb:

public boolean hasPath(int source , int dest) 
     { 
      if(source >= nNodes) 
       return false; 
      else 
      { 
       visited[source] = true; 

       try 
       { 
        Iterator<Integer> iterator = adj[source].listIterator(); 
        while(iterator.hasNext()) 
        { 
         int n = iterator.next(); 
         if(n == dest) 
          return true; 
         visited[n] = true; 
         if(hasPath(n, dest)) 
          return true; 
        }//end while 
        return false; 
       }//end try 
       catch(NullPointerException exception) 
       { 
        exception.printStackTrace(); 
       }//end catch 

       return false; 
      }//end else 
     }//end method has path 

Das Problem, dass, wenn ich diese Methode in einer Hauptklasse laufen, ich habe diesen Fehler:

Exception in thread "main" java.lang.StackOverflowError 
    at java.util.LinkedList$ListItr.<init>(Unknown Source) 
    at java.util.LinkedList.listIterator(Unknown Source) 
    at java.util.AbstractList.listIterator(Unknown Source) 
    at java.util.AbstractSequentialList.iterator(Unknown Source) 
    at logic.GameGraph.hasPath(GameGraph.java:67) 
    at logic.GameGraph.hasPath(GameGraph.java:74)at logic.GameGraph.hasPath(GameGraph.java:74) 
    at logic.GameGraph.hasPath(GameGraph.java:74) 
    at logic.GameGraph.hasPath(GameGraph.java:74) 

Linie 67 ist:

Iterator<Integer> iterator = adj[source].listIterator(); 

Und Zeile 74 ist der rekursive Aufruf:

if(hasPath(n, dest)) 

Ich habe über StackOverflowError gelesen und es hatte etwas mit Speichermangel zu tun, ich verstehe das und meine Frage ist das nicht. Aber ich verstehe nicht, warum es hier wegen des Iterators passieren sollte. Ich habe es sogar mit Knoten versucht, die nahe beieinander liegen, die nur ein paar rekursive Aufrufe machen, und der gleiche Fehler tritt auf.

+1

Sie nie, ob überprüfen mit abgedeckt haben oder Sie haben nicht alraedy den Knoten besucht. Sie markieren es nur als visised, aber wenn Sie es wieder sehen, überprüfen Sie es wieder => unendliche Rekursion. – Polygnome

+0

Fügen Sie eine 'println()' Anweisung am Anfang der Methode 'hasPath()' hinzu und drucken Sie beide Parameter. Anhand der Ausgabe können Sie herausfinden, warum Ihr Code fehlschlägt. Dies wird als ** Debugging ** bezeichnet. Vielleicht möchten Sie auch lesen "[Was ist ein Debugger und wie kann es mir helfen, Probleme zu diagnostizieren?] (Https://stackoverflow.com/q/25385173/5221149)", obwohl eine einfache 'print' Aussage ist wahrscheinlich einfacher Möglichkeit, das Problem zu sehen. – Andreas

+0

@Polygnome ja du hast Recht, danke –

Antwort

1

Bevor rekursiven Aufruf Prüfung gehen in, wenn Sie bereits, dass der Knoten von

.... 
int n = iterator.next(); 
if(!visited[n]){ 
... 
} 
+0

danke, ich habe es zu spät bemerkt –

Verwandte Themen