我正在创建一个制造房间的工厂,它传递了一个步骤和一个开始房间,它应该做一个步骤,建造一个房间,然后用更少的步骤调用自己,新房间作为开始房间. 问题是它永远不会结束。在调试器中,我可以看到它正在调用自己,这会在内存中创建另一个方法调用,实际上它少了一个步骤,但随后执行行转到当前方法调用的顶部!所以它永远不会真正完成新的调用。好像它将新调用放入堆而不是堆栈,然后从未真正到达它。
代码:
@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() 实例,但没有进入它,而是执行行返回原始呼叫的“房间房间 = start_room”。它无限地执行此操作,循环始终处于其初始值 4,并且越来越多的 place() 实例填满堆栈。我查看了新实例,实际上所有实例的“周期”值都为 3。
奇怪的是,实际运行的每个迭代都在下一个房间运行,所以当它回到顶部时,它会通过下一个房间回到顶部。但是为什么要创建 place() 的新实例(新房间和新循环值为 3),然后使用新房间而不是新循环值 3 重新运行旧 place()?