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
相关产品推荐
相关产品推荐

