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

Java不使用循环时输入非法容量如何让程序从头运行

修复方案

问题根源

  • 现有代码的菜单分支判断仅会在程序启动时执行一次。当输入的capacity非法时,你仅重新调用了menu()获取新的菜单选项,但此时所有if分支的判断流程已经执行完毕,程序不会对新拿到的选项做分支处理,自然会直接退出。

作业要求禁止使用循环结构,直接用递归实现「程序从头运行」的效果即可,不需要改你原来已经写好的menu()方法逻辑。

具体修复方式

把main方法里的核心业务逻辑抽成独立的递归方法,需要从头重启程序时直接递归调用该方法即可,修复后完整代码如下:

import java.util.Scanner;

public class YourClassName {
    // 保留你原来的全局Scanner定义
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        runApp();
    }

    // 抽离的核心程序运行逻辑,用递归替代循环实现重启
    private static void runApp() {
        int menuChoice = menu();
        if (menuChoice == 0) {
            System.out.print("End program");
            return;
        }
        if (menuChoice == 1) {
            // 在此处补全选项1的业务逻辑
            return;
        }
        if (menuChoice == 2) {
            System.out.print("Enter the Capacity>");
            double capacity = sc.nextDouble();
            if (capacity <= 0) {
                System.out.println("Wrong input");
                runApp(); // 输入非法直接从头运行整个程序,而非仅重新打印菜单
                return; // 递归后加return,避免当前栈帧剩余逻辑继续执行
            }
            // 在此处补全背包问题的正常业务逻辑
            return;
        }
        if (menuChoice == 3) {
            // 在此处补全选项3的业务逻辑
            return;
        }
        if (menuChoice == 4) {
            // 在此处补全选项4的业务逻辑
            return;
        }
        if (menuChoice == 5) {
            // 在此处补全选项5的业务逻辑
            return;
        }
    }

    // 原menu()方法无需任何修改,直接保留
    public static int menu() {
        System.out.println("0. End program");
        System.out.println("1. No Caps");
        System.out.println("2. Knapsack Problem");
        System.out.println("3. Count Ways");
        System.out.println("4. Merge Strings");
        System.out.println("5. Password Generator");
        System.out.print("Enter a digit 0-5>");
        int choice = sc.nextInt();
        if (choice > 5 || choice < 0) {
            System.out.println("Wrong input");
            return menu();
        }
        return choice;
    }
}

注意事项

  • 每个菜单分支的逻辑执行完、或者触发重启的递归调用后,必须加return终止当前方法的执行,避免旧栈帧里的残留逻辑被触发。
  • 整个实现没有使用任何for/while循环结构,完全符合作业要求。不管是菜单输入非法、还是容量输入非法,调用runApp()都会完整走一遍从菜单展示到选项处理的全流程,不会出现选完菜单直接退出的问题。

内容的提问来源于stack exchange,提问作者shir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:06:11