gpt4 book ai didi

java - 迷宫生成给我一个堆栈溢出错误

转载 作者:行者123 更新时间:2023-12-02 05:17:33 25 4
gpt4 key购买 nike

在我的迷宫生成代码中,我收到堆栈溢出错误,为什么?我如何解决它?它只发生在最后。如果我注释掉 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)

最佳答案

你的堆栈非常详细地告诉你两件事:

  • 实际上,您遇到了堆栈溢出,该溢出并不是由忘记索引增量或类似原因引起的。
  • 代码(从外观上看)并未陷入无限循环,因为堆栈帧在代码中的不同行处终止。如果不同,就会出现无限循环。它仍然可能是一个(被看似随机性所隐藏),但可能性要小得多。

目前,每当您执行递归调用(在生成中调用generate)时,都会增加堆栈的大小。您将所有当前字段状态传递到堆栈帧中,并且当您继续下一个较低的generate调用时,虚拟机必须记住这一点。因为这可能还会调用自身,等等,在某些时候,堆栈变得太大而无法存储在堆栈上。

我认为你有两个选择。启动虚拟机时增加最大堆栈大小设置 JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx1024m或者(更好的选择)重新编写代码以进行迭代。这样,您就不会无限期地增加筹码量。这意味着什么:

您必须创建通过显式设计访问堆栈不同级别的循环,而不是递归地工作(调用方法本身)。所有递归代码都可以(在 IT 理论中)转换为迭代代码,所以这应该是可能的。但是,您必须以不同的方式思考。

关于java - 迷宫生成给我一个堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56285780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com