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

标签 java

我正在尝试使用 DFS 迷宫生成器生成一个大小约为 350x350 的迷宫。 我的代码非常适合大小约为 150 甚至 250 的矩阵,但如果我向上移动,例如 350x350,代码将失败并抛出 stackOverflowErrors。 每次我尝试调用 recursion(int x,int y) 时都会收到错误,有时我会在 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]);
}
}    

Position 类是这样的:

public class Position {
private int x, y;

public Position(int x, int y){
    this.x=x;
    this.y=y;
}

public int getX(){
    return this.x;
}

public int getY(){
    return this.y;
}

public void setXY(int x, int y){
    this.x=x;
    this.y=y;
}
}    

更新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 允许的调用堆栈大小。这与增加程序内存不同。看这个answer

关于Java StackOverflowError - 生成相对较大的二维数组(350 x 350),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26936084/

相关文章:

java - Eclipse:如何运行单个继承的 JUnit 测试方法

java - 如何从 Java 中的另一个类获取变量?

java - 从 IVariable 对象表示中提取真实对象

java - 为什么在使用异步记录器时使用 Log4J2 写入大量日志条目速度较慢

java - PSQLException 仅 8.2 及更高版本的服务器支持返回自动生成的键

java - Hibernate 身份生成器问题

java - Kafka KStream - 测量消费者滞后

java - 如何在java中实现杰卡德系数?

java - 在 Java 中获取单个字符串中的所有参数

java - 根据偏好对一群人进行排序