我在学校上Java课。我们分配了这个任务来设计一个类,使其具有菜单功能,并带有多个子菜单。

结构有点像这样(下面的伪代码只是为了显示结构):

public static void mainMenu() {

switch(integer variable){

case 1: submenu1();
break;
case 2: submenu2();
break;
}
}



public static void submenu1() {

switch(integer variable){

case 1: subsubmenu1();
break;
case 2: subsubmenu2();
break;
default: mainMenu(
}
}


public static void subsubmenu1() {

switch(integer variable) {
case 1:  anothersubmenu1()
break;
case 2:  anothersubmenu2();
break;
default: submenu1();
}
}


我的问题是:我的老师说这是错误的,因为如果我这样做,JVM将程序从一个地方到另一个地方的路径存储在内存中,从长远来看,这将导致堆栈溢出。他还没有完全解释它,他只是说我应该使用一个布尔变量将while循环括起来,并添加一个选项来翻转该布尔值以退出while循环,因为这种方式Java不会存储程序从一种方法转换到另一种方法的路径。

再次,他没有详细解释它,这听起来使他解释它的方式非常混乱(我尝试根据他给我的提供尽可能清楚地使它变得清晰)。我一直在网上寻找最近​​3个小时内与他告诉我的内容类似的信息,但找不到任何信息...所以我决定向专家咨询。

你们能帮我吗?

最佳答案

是的,您的老师是(部分)正确的。
关键部分是您可能从mainMenu()内部调用submenu1(),而在submenu1()内部调用subsubmenu1()
如果您每次在mainMenu()中都调用submenu1(),而在submenu1()中则每次调用mainMenu(),则程序将崩溃。

对于每个函数调用,底层系统都需要为函数的局部变量等保留内存。这就是所谓的堆栈框架。当您从自身内部(直接或间接)调用函数时,它称为recursion。递归需要在某个时候返回。如果不是这样,则会因为内存用完而导致stackoverflow。

07-24 09:21