如何让Java编写的控制台菜单支持多次输入选项而不自动退出
问题原因与解决方法
你当前的代码仅执行一次菜单展示、输入读取、分支处理逻辑,执行完成后会直接运行到main方法末尾自然退出程序,因此无法支持多次选择。你可以通过添加循环结构包裹菜单逻辑实现需求,具体修改方案如下:
核心修改要点
- 用
while(true)死循环包裹菜单打印、输入读取、分支判断的全部相关代码,新增退出选项(比如输入4则退出),触发退出时调用break跳出循环结束程序 - 不要随意关闭读取
System.in的Scanner对象,也不要重复创建该对象,避免输入流被提前关闭后无法再次读取输入 - 原有
checklimit方法存在数组越界风险:你声明的Goods数组长度为10,下标范围是0-9,原来的循环条件i <=10会访问到下标10的位置触发报错,需修正为i < goodsArr.length - 读取Supplier.txt的逻辑不要放在菜单循环内,避免每次选择菜单都重复读取文件,可根据你的业务需求调整到对应功能分支(比如选项3的补货逻辑内)
修改后完整代码
import java.util.Scanner; import java.io.File; import java.io.FileNotFoundException; public class Main { public static void main(String[] args) { Goods[] goodsArr = new Goods[10]; int option; // 全局只创建一次读取控制台输入的Scanner,不要重复创建或关闭 Scanner scanner = new Scanner(System.in); // 菜单循环开始 while(true) { System.out.println("------------------------"); System.out.println("WELCOME TO OUR MENU"); System.out.println("------------------------"); System.out.println("1.Read in Items"); System.out.println("2.Check Reorder Level"); System.out.println("3.Reorder items"); System.out.println("4.Exit Program"); // 新增退出选项 System.out.println("------------------------"); System.out.println("ENTER NUMBERS (1-4)"); System.out.println("------------------------"); option = scanner.nextInt(); if(option == 1) { inventory(goodsArr); } else if(option == 2) { checklimit(goodsArr); } else if(option == 3) { // 读取Supplier.txt的代码放在补货逻辑分支内 try { Scanner fileScanner = new Scanner(new File("Supplier.txt")); while (fileScanner.hasNextLine()) { String splrline = fileScanner.nextLine(); String [] splrArray = splrline.split(","); Supplier splr = new Supplier(splrArray[0],splrArray[1],splrArray[2],Double.parseDouble(splrArray[3])); } fileScanner.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } else if(option == 4) { System.out.println("程序退出"); break; // 跳出循环,结束程序 } else { System.out.println("输入非法,请输入1-4之间的数字"); } } // 程序结束前再关闭Scanner scanner.close(); } public static void inventory(Goods[] goodsArr) { try { Scanner scanner = new Scanner(new File("Inventory.txt")); int i=0; while (scanner.hasNextLine() && i < goodsArr.length) { // 加判断避免数组越界 String itemline = scanner.nextLine(); String [] lineArray = itemline.split(","); Goods item = new Goods(lineArray[0],lineArray[1],lineArray[2],Double.parseDouble(lineArray[3]),Integer.parseInt(lineArray[4]),Integer.parseInt(lineArray[5]),lineArray[6],Integer.parseInt(lineArray[7])); goodsArr[i] = item; i++; } scanner.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } public static void checklimit(Goods[] goodsArr){ // 修正循环条件,避免数组越界 for (int i=0; i < goodsArr.length; i++) { if(goodsArr[i] == null) { // 加空判断避免空指针 continue; } String description = goodsArr[i].getDescription(); if(description.equals("Garden")||description.equals("Tools")) { System.out.println(goodsArr[i]); } } } }
内容的提问来源于stack exchange,提问作者Azizi Dumas
相关产品推荐
相关产品推荐

