我正在嘗試使用DFS迷宮生成器生成大小爲350x350的迷宮。 我的代碼完美適用於大小爲150甚至250的矩陣,但如果我選擇upper,比如350x350,代碼將失敗並拋出stackOverflowErrors。 每當我嘗試撥打recursion(int x,int y)
時遇到錯誤,有時我在Collection.shuffle(rn)
處遇到錯誤。Java StackOverflowError - 生成一個相對較大的二維數組(350 x 350)
的主要方法是這一個:
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]);
}
}
位置級別是這樣的:
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;
}
}
UPDATE1:
我在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)
...
你可以分配更多的內存到Java? – 2014-11-14 17:59:29
你能給我們實際的堆棧跟蹤嗎? – forgivenson 2014-11-14 17:59:53
另外檢查一些方法是否被稱爲其他方法,而其他方法是在內部調用第一個方法。 – 2014-11-14 18:16:56