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

Java中选择switch case后如何返回主菜单?

问题描述

我正在开发一个行程管理程序,需要显示带选项的菜单供用户选择。比如用户选择选项1时,我希望显示员工列表后自动返回主菜单继续操作。但实际情况是,选择选项1后,员工信息会打印出来,但后续的“End of list”没显示,主菜单也不再出现,程序没终止但卡住了,只能手动结束。我怀疑有无限循环,就在选项1的处理里加了调试语句“End of list”,但这条语句从未输出。

相关代码

TripManagement类

public static void main(String[] args) {
    TripManagement tm = new TripManagement();

    // 加载数据到容器
    tm.loadEmployees();
    tm.loadTrucks();
    tm.loadTrips();

    Scanner scanner = new Scanner(System.in);
    
    boolean more = true;
    int choice = -1;
    
    while(more) {
        
        try {
            // 显示主菜单
            System.out.println("-----------------------------------------");
            System.out.println("1. 显示所有员工");
            System.out.println("2. 显示所有卡车");
            System.out.println("3. 显示所有行程");
            System.out.println("4. 查询员工");
            System.out.println("5. 查询卡车");
            System.out.println("6. 查询行程");
            System.out.println("7. 添加新员工");
            System.out.println("8. 添加新卡车");
            System.out.println("9. 添加新行程");
            System.out.println("10. 保存所有数据到文件");
            System.out.println("0. 退出");
            System.out.println("请输入选择: ");
            
            // 获取用户选择
            if (scanner.hasNextInt()) {
                choice = scanner.nextInt();
                scanner.nextLine(); // 消耗换行符
            } else {
                // 清空输入缓冲区
                scanner.nextLine();
                System.out.println("输入错误,请输入有效数字。");
                continue;
            }
     
            // 处理用户选择
            switch (choice) {
                case 0: 
                    System.out.println("再见!");
                    more = false;
                    break;
                case 1:
                    tm.outputEmployees();
                    System.out.println("列表结束");
                    break;
                case 2:
                    tm.outputTrucks();
                    break;
                case 3:
                    tm.outputTrips();
                    break;
                case 4:
                    // 实现查询员工逻辑
                    break;
                case 5:
                    // 实现查询卡车逻辑
                    break;
                case 6:
                    // 实现查询行程逻辑
                    break;
                case 7:
                    // 实现添加新员工逻辑
                    break;
                case 8:
                    // 实现添加新卡车逻辑
                    break;
                case 9:
                    // 实现添加新行程逻辑
                    break;
                case 10:
                    // 实现保存数据到文件逻辑
                    break;
                default:
                    System.out.println("无效选择,请选择有效选项。");
                    break;
            }
            
        } catch(InputMismatchException e) {
            System.out.println("输入类型错误: " + e);
            
        }
        
    } 
}

public void outputEmployees() {
    try(Formatter formatter = new Formatter(System.out)) {
        for(Employee employee : employees) {
            employee.outputFormatter(formatter);
            formatter.format("%n");
        }
    }
}

Employee类

public void outputFormatter(Formatter output) {
    output.format("员工编号: %d%n", getNumber());
    output.format("姓名: %s%n", name);
    output.format("出生日期: %s%n", dob);
    output.format("地址: %s%n", address); 
}

选择选项1时的输出

-----------------------------------------
1. 显示所有员工
2. 显示所有卡车
3. 显示所有行程
4. 查询员工
5. 查询卡车
6. 查询行程
7. 添加新员工
8. 添加新卡车
9. 添加新行程
10. 保存所有数据到文件
0. 退出
请输入选择: 
1
员工编号 1
员工编号 2
员工编号 3
...
解决方案

问题根源在于outputEmployees()方法中使用了try-with-resources来管理Formatter实例。当try块执行完毕时,Formatter会被自动关闭,而关闭Formatter会同时关闭它关联的底层输出流——也就是System.out标准输出流。

一旦System.out被关闭,后续所有通过System.out.println()或System.out.format()的输出都会失效,程序虽然还在循环执行主菜单的打印逻辑,但内容无法输出到控制台,看起来就像卡住了。同时你添加的“列表结束”语句也因为System.out被关闭而无法显示。

修复方法很简单,不要用try-with-resources包裹Formatter(System.out),因为System.out是由JVM管理的标准输出流,不需要我们手动关闭:

public void outputEmployees() {
    Formatter formatter = new Formatter(System.out);
    for(Employee employee : employees) {
        employee.outputFormatter(formatter);
        formatter.format("%n");
    }
    // 不需要关闭formatter,避免关闭System.out
}

修复后,System.out不会被关闭,执行完outputEmployees()后,“列表结束”会正常显示,主菜单也会重新打印出来,程序可以继续接收用户选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:05:29