DFS中的迭代器导致java.lang.StackOverflower错误
我目前正试图通过自己创建graph类来制作游戏的图形表示。 构造函数就是这个(希望这里没有任何逻辑错误):DFS中的迭代器导致java.lang.StackOverflower错误,java,recursion,iterator,stack-overflow,Java,Recursion,Iterator,Stack Overflow,我目前正试图通过自己创建graph类来制作游戏的图形表示。 构造函数就是这个(希望这里没有任何逻辑错误): 我读过StackOverflowerr,它与可用内存不足有关,我理解这一点,我的问题不是这样。但我不明白为什么它会发生在这里,因为迭代器。我甚至尝试过使用彼此接近的节点,这些节点只进行几个递归调用,同样的错误也会发生 在进入递归调用之前,请检查您是否已经使用 .... int n = iterator.next(); if(!visited[n]){ ... } 您从未检查是否已访问该节
我读过StackOverflowerr,它与可用内存不足有关,我理解这一点,我的问题不是这样。但我不明白为什么它会发生在这里,因为迭代器。我甚至尝试过使用彼此接近的节点,这些节点只进行几个递归调用,同样的错误也会发生 在进入递归调用之前,请检查您是否已经使用
....
int n = iterator.next();
if(!visited[n]){
...
}
您从未检查是否已访问该节点。只将其标记为viisited,但当再次遇到它时,再次检查它=>无限递归。在方法
hasPath()
的开头添加println()
语句,打印两个参数。输出将有助于确定代码失败的原因。这叫做调试。您可能还想阅读“”,不过简单的打印语句可能更容易看出问题。@Polygenme是的,您是对的,谢谢
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
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)
Iterator<Integer> iterator = adj[source].listIterator();
if(hasPath(n, dest))
....
int n = iterator.next();
if(!visited[n]){
...
}