Java学生管理控制台程序:while循环中检查静态容量限制问题
控制台学生管理程序:容量控制问题修复与优化建议
我正在自学Java,开发一款控制台学生管理程序,核心功能是添加新学生,希望实现当达到最大学生容量时停止添加并给出提示,同时希望得到代码优化建议。
原代码
Main类(问题集中在case 2)
boolean abort = false; boolean unlocked = false; //Student[] students = new Student[School.MAX_studentEntered]; ArrayList<Student> students= new ArrayList<>(); Scanner option = new Scanner(System.in); while (!abort){ //for as long as the value is not abort the loop will run System.out.println("Unlock Admin(1) New Student(2) Show Students(3) Statistics (4) Exit(0) "); System.out.print("Input: "); int input = option.nextInt(); switch (input){ case 0:{ abort = true; break; } case 1:{ System.out.println("Admin"); unlocked = true; break; } case 2: { System.out.println("Create a student"); int time = 0; while (time<=School.MAX_studentEntered) { Scanner st = new Scanner(System.in); System.out.print("Name: "); String name = st.nextLine(); System.out.print("Age: "); int age = st.nextInt(); Student student = new Student(); student.setName(name); student.setAge(age); students.add(student); time++; if(unlocked){ System.out.print("Create another student? (yes/no): "); Scanner ans= new Scanner(System.in); String answer = ans.nextLine(); if (!answer.equals("yes")) { break; } else { if(time>School.MAX_studentEntered){ System.out.println("You have reached the max capacity!"); break; } else { continue; } } } if(time>School.MAX_studentEntered){ System.out.println("You have reached the max capacity!"); break; } else { break; } } break; } }
Student类
public class Student { String name; int age; public Student(){ School.studentEntered++; } public void setName(String name){ this.name = name; } public void setAge(int age){ //void - save the value this.age = age; } public String getName(){ //return - show the value return name; } public int getAge(){ return age; } }
School类
public class School { static int studentEntered = 0; static final int MAX_studentEntered=3; public School(){ // it is automaticlly created when the class is created // it does not need a void or return studentEntered++; } }
问题分析
- 循环条件错误:case2中
while (time<=School.MAX_studentEntered)会允许添加MAX_studentEntered+1个学生,当time等于最大值时仍会执行循环。 - Scanner重复创建:每次循环都创建新的Scanner,会导致输入流混乱(比如
nextInt()后残留的换行符会被nextLine()读取)。 - 容量判断时机滞后:现有逻辑是先添加学生再判断容量,可能导致超出限制后才提示。
- 计数逻辑重复:Student构造函数和School构造函数都在递增
studentEntered,如果实例化School类会导致计数错误。 - 嵌套逻辑混乱:unlocked状态下的判断分支嵌套过深,容易出现逻辑漏洞(比如用户选择yes后才检查容量,此时可能已经添加了超量学生)。
修复后的核心代码(Main类case2)
case 2: { // 添加前先检查容量 if (students.size() >= School.MAX_studentEntered) { System.out.println("You have reached the max capacity!"); break; } System.out.println("Create a student"); // 复用全局的Scanner,避免重复创建 option.nextLine(); // 清除nextInt()残留的换行符 System.out.print("Name: "); String name = option.nextLine(); System.out.print("Age: "); int age = option.nextInt(); Student student = new Student(); student.setName(name); student.setAge(age); students.add(student); System.out.println("Student added successfully!"); // 管理员模式下询问是否继续添加 if (unlocked) { while (true) { // 检查是否还有容量 if (students.size() >= School.MAX_studentEntered) { System.out.println("You have reached the max capacity!"); break; } option.nextLine(); // 清除换行符 System.out.print("Create another student? (yes/no): "); String answer = option.nextLine().trim(); if (!answer.equalsIgnoreCase("yes")) { break; } // 继续添加学生 System.out.print("Name: "); name = option.nextLine(); System.out.print("Age: "); age = option.nextInt(); Student newStudent = new Student(); newStudent.setName(name); newStudent.setAge(age); students.add(newStudent); System.out.println("Student added successfully!"); } } break; }
同时修改School类,移除构造函数中的冗余计数逻辑:
public class School { static int studentEntered = 0; static final int MAX_studentEntered=3; // 移除构造函数中的studentEntered++,避免重复计数 }
优化建议
- 统一输入处理:整个程序只使用一个Scanner对象,避免输入流异常,同时处理
nextInt()后的换行符问题。 - 前置容量检查:在任何添加学生的操作前先判断是否已满,从根源避免超量添加。
- 移除冗余计数:直接使用
students.size()获取当前学生数量,不需要额外的studentEntered静态变量,减少维护成本。 - 封装逻辑到方法:把添加学生的逻辑封装成
addStudent()方法,提高代码可读性和复用性。 - 异常处理:添加输入异常捕获(比如用户输入非整数的年龄时),避免程序崩溃。
- 代码格式化:规范缩进和换行,提高代码可读性。
- 常量命名规范:将
MAX_studentEntered改为MAX_STUDENT_CAPACITY,符合Java大写下划线的常量命名规范。
内容的提问来源于stack exchange,提问作者Altin Mag.
相关产品推荐
相关产品推荐

