Java StackOverflowerError-生成相对较大的二维数组(350 x 350)

Java StackOverflowerError-生成相对较大的二维数组(350 x 350),java,Java,我正在尝试使用DFS迷宫生成器生成一个350x350大小的迷宫。 我的代码非常适合大小在150甚至250左右的矩阵,但如果我使用更高的值,比如350x350,代码将失败并抛出StackOverflowers错误。 每次我尝试调用递归(intx,inty)时都会出现错误,有时在Collection.shuffle(rn)时也会出现错误 主要的方法是: Scanner console = new Scanner(System.in); int row = console.nextInt(); int

我正在尝试使用DFS迷宫生成器生成一个350x350大小的迷宫。 我的代码非常适合大小在150甚至250左右的矩阵,但如果我使用更高的值,比如350x350,代码将失败并抛出StackOverflowers错误。 每次我尝试调用
递归(intx,inty)
时都会出现错误,有时在
Collection.shuffle(rn)
时也会出现错误

主要的方法是:

Scanner console = new Scanner(System.in);
int row = console.nextInt();
int column = console.nextInt();
Labirintus t = new Labirintus(row, column); 
t.generalLbairinuts(1, 1);    
。 下面是创建迷宫的类:

package projekt;
import java.util.ArrayList;
import java.util.Collections;
public class Labirintus {

private int row;
private int column;
private int [][] t;

public Labirintus(int row, int column){
    this.row=row;
    this.column=column;
    t= new int[row][column];
    for(int i=0; i<row; ++i){
        for(int j=0; j<column; ++j){
            t[i][j]=1;
        }
    }
}

public int getRow(){
    return this.row;
}

public int getColumn(){
    return this.column;
}

public void setElement(Position p){
    t[p.getX()][p.getY()] = 0;
}

public void generalLbairinuts(int x, int y){

    recursion(x, y);

}

public int printXY(int x, int y){
    return this.t[x][y];
}

public void recursion(int x, int y){

    Integer[] direction = randomDirection();

    for (int i=0; i< direction.length; ++i){
        switch(direction[i]){
            case 1: //Up
                if(x<=2) continue;
                if(this.t[x-2][y] != 0){
                    this.t[x-2][y] = 0;
                    this.t[x-1][y] = 0;
                    recursion(x-2, y);
                }
                break;
            case 2: //Right
                if(y + 2 >= this.column - 1) continue;
                if(this.t[x][y+2] != 0){
                    this.t[x][y+2] = 0;
                    this.t[x][y+1] = 0;
                    recursion(x, y+2);
                }
                break;
            case 3: //Down
                if(x + 2 >= this.row - 1) continue;
                if(this.t[x+2][y] != 0){
                    this.t[x+2][y] = 0;
                    this.t[x+1][y] = 0;
                    recursion(x+2, y);
                }
                break;
            case 4: //Left
                if(y - 2 <= 0) continue;
                if(this.t[x][y-2] != 0){
                    this.t[x][y-2] = 0;
                    this.t[x][y-1] = 0;
                    recursion(x, y-2);
                }
                break;
        }
    }

}

public Integer[] randomDirection(){
    ArrayList<Integer> rn = new ArrayList<Integer>();
    for(int i=0; i<4; ++i){
        rn.add(i+1);
    }
    Collections.shuffle(rn);
    return rn.toArray(new Integer[4]);
}
}    
更新1:

我是JAVA新手,所以我只认为这是堆栈跟踪:

Exception in thread "main" java.lang.StackOverflowError
at java.util.Collections.shuffle(Collections.java:469)
at projekt.Labirintus.randomDirection(Labirintus.java:105)
at projekt.Labirintus.recursion(Labirintus.java:60)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:69)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:85)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:85)
at projekt.Labirintus.recursion(Labirintus.java:85)
at projekt.Labirintus.recursion(Labirintus.java:85)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:69)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:85)
at projekt.Labirintus.recursion(Labirintus.java:85)
...

递归基本上是一次又一次地调用相同的方法。因此,您需要做的是使用标志增加jvm允许的调用堆栈大小。这与增加程序内存不同。看这个

你的问题引起了我的兴趣,然后我开始做一个迷宫生成器,用基于堆栈/队列的迭代代码来分叉你的代码(这在本文中提供),而不依赖调用递归。 我完全改变了你们的模型和算法,所以并没有保留原来的任何东西。 我真的可以翻过1000x1000个迷宫。 鉴于我的模型是基于移动的,而不是基于墙的,它对应于2000x2000用于您的实现。 我用它为labrytinth创建了一个stl生成器,以便能够用3D打印机打印它。 它仍然没有完成,但是可以在这里找到完整的代码:


我真的做到了irl(2018年更新):

你能给Java分配更多内存吗?你能给我们实际的stacktrace吗?还要检查某个方法是否被称为其他方法,以及其他方法是否在内部调用第一个方法。如果你想做一些优化,你可以使用int[]而不是Integer[]作为方向数组。如果你想做一些更聪明的事情来限制堆栈帧的大小,你可以将四个不同的方向编码成一个整数。所以,如果我完全理解它的意思,当我使用一个大堆栈时,最好找到一个算法,它没有像这个算法那样使用堆栈?或者在我的情况下,我需要显著增加堆栈?没错。但是如果这是堆栈的“限制”,那么增加到这个限制就可以了。谢谢。然后我想我会把代码转录成一个迭代版本。
Exception in thread "main" java.lang.StackOverflowError
at java.util.Collections.shuffle(Collections.java:469)
at projekt.Labirintus.randomDirection(Labirintus.java:105)
at projekt.Labirintus.recursion(Labirintus.java:60)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:69)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:85)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:85)
at projekt.Labirintus.recursion(Labirintus.java:85)
at projekt.Labirintus.recursion(Labirintus.java:85)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:69)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:77)
at projekt.Labirintus.recursion(Labirintus.java:85)
at projekt.Labirintus.recursion(Labirintus.java:85)
...