Java菜单驱动程序NoSuchElementException错误排查与需求实现
问题解决:菜单驱动Java程序的NoSuchElementException修复及需求实现
错误原因分析
main方法中使用sc.nextInt()读取菜单选项后,输入缓冲区残留换行符,后续读取操作会受干扰addGrp方法使用try-with-resources创建Scanner,执行完毕后会自动关闭底层的System.in流,导致main方法中的Scanner无法再读取输入,抛出NoSuchElementException- 方法内重复创建
Scanner实例,造成输入流资源管理混乱
需求实现调整
原需求是将学生数据存入数组后作为对象存入LinkedList,当前代码直接存储单个字符串,不符合要求。需:
- 创建
Group类封装组名和成员数组 - 将
LinkedList<String>改为LinkedList<Group>,存储整个组的对象
修正后的完整代码
import java.util.*; public class LinkedListDemo { // 存储Group对象的LinkedList,而非单个字符串 LinkedList<Group> groupList = new LinkedList<>(); // 封装组信息的实体类 static class Group { private String groupName; private String[] members; public Group(String groupName, String[] members) { this.groupName = groupName; this.members = members; } public String getGroupName() { return groupName; } public String[] getMembers() { return members; } } public void addGrp(Scanner sc) { try { String[] members = new String[7]; // 读取组长和6名学生 System.out.println("Enter Group lead Name"); members[0] = sc.nextLine(); for (int i = 1; i < 7; i++) { System.out.println("Enter Student Name"); members[i] = sc.nextLine(); } System.out.println("Enter the name of your project group"); String groupName = sc.nextLine(); // 将组信息封装为Group对象存入LinkedList Group newGroup = new Group(groupName, members); groupList.add(newGroup); // 打印当前组信息 System.out.print("Project group name is: " + groupName + " and Members are "); for (String member : members) { System.out.print(member + " "); } System.out.println(); } catch (Exception e) { e.printStackTrace(); } } // 实现display方法,打印所有组的信息 public void display() { if (groupList.isEmpty()) { System.out.println("No groups added yet."); return; } System.out.println("All Project Groups:"); for (int i = 0; i < groupList.size(); i++) { Group group = groupList.get(i); System.out.println("Group " + (i + 1) + ": " + group.getGroupName()); System.out.println("Members:"); String[] members = group.getMembers(); for (int j = 0; j < members.length; j++) { if (j == 0) { System.out.println(" Group Lead: " + members[j]); } else { System.out.println(" Student " + j + ": " + members[j]); } } System.out.println(); } } public static void main(String arg[]) { LinkedListDemo ll = new LinkedListDemo(); // 全局唯一Scanner实例,避免重复创建和流关闭问题 Scanner sc = new Scanner(System.in); int ch; do { System.out.println("\n1.addGrp\n2.display\n0.Exit"); // 处理nextInt后的换行符:先读取整数,再用nextLine吃掉残留的换行 while (!sc.hasNextInt()) { System.out.println("Please enter a valid number!"); sc.nextLine(); } ch = sc.nextInt(); sc.nextLine(); // 清除缓冲区的换行符 switch (ch) { case 1: ll.addGrp(sc); break; case 2: ll.display(); break; case 0: System.out.println("Exiting program..."); break; default: System.out.println("Invalid option, please try again."); } } while (ch != 0); sc.close(); // 程序结束时关闭Scanner } }
关键修正点说明
- 统一Scanner管理:整个程序只用一个
Scanner实例,传入addGrp方法使用,避免重复创建导致的System.in流关闭问题 - 处理换行符残留:
sc.nextInt()后调用sc.nextLine()清除缓冲区的换行,避免后续sc.nextLine()读取到空字符串 - 封装Group对象:创建
Group类存储组名和成员数组,将整个组作为对象存入LinkedList,符合需求 - 实现display方法:遍历LinkedList,打印所有组的详细信息
- 移除无用Node类:原Node类未被使用,替换为业务相关的Group类
内容的提问来源于stack exchange,提问作者Kochi_20_Gaurav Patil
相关产品推荐
相关产品推荐

