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

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
    }
}

关键修正点说明

  1. 统一Scanner管理:整个程序只用一个Scanner实例,传入addGrp方法使用,避免重复创建导致的System.in流关闭问题
  2. 处理换行符残留:sc.nextInt()后调用sc.nextLine()清除缓冲区的换行,避免后续sc.nextLine()读取到空字符串
  3. 封装Group对象:创建Group类存储组名和成员数组,将整个组作为对象存入LinkedList,符合需求
  4. 实现display方法:遍历LinkedList,打印所有组的详细信息
  5. 移除无用Node类:原Node类未被使用,替换为业务相关的Group类

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:42:06