You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:54:26