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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:05