私は部屋を作る工場を作っています、そしてそれはステップのintとスタートルームを通過し、そしてそれはステップを実行し、部屋を作り、そしてそれから一歩少ないステップでそれ自身を呼び、そして新しい部屋をスタートルームとして呼ぶことになっています。問題はそれが決して終わらないということです。デバッガーでは、それ自体が呼び出していることがわかります。これにより、実際にはステップが1つ少ない別のメソッド呼び出しがメモリ内に作成されますが、実行行は現在のメソッド呼び出しの先頭に移動します。したがって、実際に新しい呼び出しが完了することはありません。新しい呼び出しをスタックではなくヒープに入れて、実際に到達することはないかのように。
コード:
@Override
public Room place(Level level, int cycles, Room start_room,
Direction direction, int shop, int exit, LevelFactoryReport report) throws Exception
{
Room room = null;
if(cycles < 1)
{
return start_room;
}
else
{
report.addEvent("--Placer step--");
report.addEvent("Steps remaining: "+cycles);
room = this.Step(level, start_room, direction, shop, exit, report);
if(room == null)
{
cycles = 0;
report.addEvent("Step returned a null room (probably because it ran into an existing room). Ending cycle.");
}
}
return place(level, (cycles--), room, direction, (shop--), (exit--), report);
}
上記のコードでは、さまざまな実装を経て、place()の新しい呼び出しに到達し、place()の新しいインスタンスを作成するだけですが、それにステップインせず、代わりに実行行が移動します元の呼び出しの「Roomroom=start_room」に戻ります。これは無限に行われ、サイクルは常に初期値の4であり、place()のインスタンスがスタックを埋め尽くします。新しいインスタンスを調べましたが、実際にはすべてのインスタンスの「サイクル」値は3です。
奇妙なことに、実際に実行される各反復は次の部屋で実行されているため、トップに戻ると、次の部屋を通過してトップに戻ります。しかし、なぜそれはplace()の新しいインスタンスを作成し(新しい部屋と新しいサイクル値3で)、新しい部屋を使用して古いplace()を再実行しますが、新しいサイクル値3ではないのですか?