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

