在我的迷宫生成代码中,我得到了一个堆栈溢出错误,为什么?我该如何修复它?它只在末尾发生。如果我注释掉else语句中的一个If语句,代码就能正常工作。为什么会这样呢?我试图递归地生成一个迷宫,但我不确定我做得是否正确
public void generate(int row, int col) {
rng = new Random();
int move = rng.nextInt(4);
if(hasUnvisited()==false) {
System.out.println("e");
}
else if(move==0&&row+2<=19) {
if (maze[row+2][col].getVisited()==false) {
maze[row+1][col].remove();
}
maze[row][col].visit();
generate(row+2,col);
}
else if(move==1&&row-2>=0) {
if (maze[row-2][col].getVisited()==false) {
maze[row-1][col].remove();
}
maze[row][col].visit();
generate(row-2,col);
}
else if(move==2&&col+2<=19) {
if (maze[row][col+2].getVisited()==false) {
maze[row][col+1].remove();
}
maze[row][col].visit();
generate(row,col+2);
}
else if(move==3&&col-2>=0) {
if (maze[row][col-2].getVisited()==false) {
maze[row][col-1].remove();
}
maze[row][col].visit();
generate(row,col-2);
}
else {
maze[row][col].visit();
if (move==0) {
generate(row-2,col);
}
else if (move==1) {
generate(row+2,col);
}
else if (move==2) {
generate(row,col-2);
}
else if (move==3) {
generate(row,col+2);
}
}
}
Exception in thread "main" java.lang.StackOverflowError
at java.util.Random.<init>(Unknown Source)
at Maze.generate(Maze.java:41)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:94)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:94)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:88)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:88)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:88)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:94)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:94)
at Maze.generate(Maze.java:88)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:88)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:67)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:74)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:60)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:53)
at Maze.generate(Maze.java:67)
发布于 2019-05-24 14:24:11
您的堆栈在告诉您两件事时非常冗长:
目前,无论何时进行递归调用(在generate中调用generate
),都会增加堆栈的大小。您将所有当前字段状态传递到一个堆栈帧中,VM必须记住这一点,同时继续generate
的下一个较低层调用。因为这可能还会调用自身,以此类推,在某些时候,堆栈会变得太大而无法存储在堆栈上。
在我看来,你有两个选择。要么在启动VM set JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx1024m
时增加最大堆栈大小,要么(更好的选择)重写代码以进行迭代。这样,您就不会无限期地增加堆栈。这意味着什么:
而不是递归地工作(调用方法本身),您必须创建循环,通过显式设计访问不同级别的堆栈。所有的递归代码(在IT理论中)都可以转换为迭代代码,因此这应该是可能的。然而,你必须以不同的方式思考。
https://stackoverflow.com/questions/56285780
复制相似问题