2

我正在创建一个制造房间的工厂,它传递了一个步骤和一个开始房间,它应该做一个步骤,建造一个房间,然后用更少的步骤调用自己,新房间作为开始房间. 问题是它永远不会结束。在调试器中,我可以看到它正在调用自己,这会在内存中创建另一个方法调用,实际上它少了一个步骤,但随后执行行转到当前方法调用的顶部!所以它永远不会真正完成新的调用。好像它将新调用放入堆而不是堆栈,然后从未真正到达它。

代码:

@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()?

4

2 回答 2

6

您正在使用cycles--,shop--来减少变量。然而,虽然x--确实减少了 x,但它不会返回减少的值。表达式的返回值x--是 的旧值x。使用x-1而不是x--. (或者--x如果你必须,但在这里改变变量没有意义)。

于 2010-07-11T21:21:55.193 回答
1

尝试替换这一行:

return place(level, (cycles--), room, direction, (shop--), (exit--), report);

用这条线:

return place(level, (--cycles), room, direction, (--shop), (--exit), report);

也许你可以在这里找到更多帮助

于 2010-07-11T21:24:29.083 回答