在finally块中递归调用当前方法实现菜单循环是否推荐?
这种循环实现方式不推荐,存在明显问题
你的代码确实能暂时运行,但有几个严重的问题,绝对不建议这么写:
核心问题
- 递归调用会触发栈溢出:每次调用
Run()都会在JVM的调用栈中新增一个栈帧,随着循环次数增加,栈帧会持续积累,最终触发StackOverflowError导致程序崩溃。迭代循环(比如while(true))才是这类菜单循环的正确选择,不会有栈溢出风险。 - Scanner资源管理混乱:每次进入
Run()都新建Scanner实例,重复创建关联System.in的扫描器可能引发流操作冲突;而且你从未主动关闭Scanner,虽然System.exit(0)会终止JVM释放资源,但正常循环时会持续浪费系统资源。 - 异常处理有缺陷:你写的
Exeption是拼写错误(正确应为Exception);当用户输入非整数时,Scanner会进入错误状态,如果不清空缓冲区,后续的nextInt()会一直读取失败,陷入无限错误循环。 System.exit(0)过于暴力:直接终止整个JVM,如果你后续需要在退出前清理资源(比如关闭文件、释放连接),这种方式会跳过所有清理逻辑,留下隐患。
改进后的示例代码
public void run() { // 遵循Java规范,方法名小写开头 Scanner myObj = new Scanner(System.in); int menuInput; while (true) { // 用迭代循环替代递归 try { System.out.println(" 1) call something\n2) quit"); menuInput = myObj.nextInt(); myObj.nextLine(); // 清除输入后的换行符 switch(menuInput) { case 1: something(); break; case 2: myObj.close(); // 先关闭资源 return; // 正常退出方法,而非直接终止JVM default: System.out.println("无效选项,请重新输入"); } } catch (Exception e ){ // 修正拼写错误 System.out.println("输入无效,请输入数字"); myObj.nextLine(); // 清空错误输入,避免死循环 } } }
内容的提问来源于stack exchange,提问作者Seth Buchanan
相关产品推荐
相关产品推荐

