初期学生管理系统应优先使用ArrayList而非数据库,Student类需含id、name、score及getter/setter,StudentManager用List封装增删改查,add时须校验id唯一性并用equals比较,输入统一用nextLine()再转换类型,修改信息应调用setter而非替换对象,且必须处理null和NumberFormatException。

用 ArrayList 存学生,别急着上数据库
新手写学生管理系统,第一反应常是“得连 MySQL”,其实大可不必。初期核心是理清对象关系和增删改查逻辑,ArrayList 完全够用,也方便调试。
常见错误:直接定义 Student[] students = new Student[100] —— 容量固定、扩容麻烦、空指针易发。用 ArrayList 更自然。
-
Student类至少包含id(String或int)、name、score字段,加 getter/setter 和带参构造 - 管理类(如
StudentManager)持有一个private Liststudents = new ArrayList() - 所有操作(添加、按 ID 查找、删除)都基于这个列表,不涉及 IO 或 SQL
add() 时校验学号唯一性,否则后续查找全乱
很多初学者只管往 ArrayList 里塞,结果插入重复 id,后面用 findById() 返回多个或随机一个——这不是 bug,是设计漏洞。
必须在 add(Student s) 方法里先遍历检查:
立即学习“Java免费学习笔记(深入)”;
for (Student stu : students) {
if (stu.getId().equals(s.getId())) {
System.out.println("学号 " + s.getId() + " 已存在,添加失败");
return false;
}
}
students.add(s);
- 别用 == 比较
id(字符串要用.equals()) - 返回
boolean表示是否成功,方便调用方做提示 - 如果后期换
HashMap,这里就是天然过渡点
用 Scanner 读输入时,nextLine() 吃掉回车是高频陷阱
比如先用 scanner.nextInt() 读年龄,再用 scanner.nextLine() 读姓名,结果姓名直接为空——因为 nextInt() 不吞回车,nextLine() 把它当成了空行。
解决方法统一用 nextLine(),再手动转类型:
String ageStr = scanner.nextLine(); int age = Integer.parseInt(ageStr); // 加 try-catch 更稳妥
- 所有输入都走
nextLine(),避免状态错乱 - 数字类字段务必用
Integer.parseInt()等转换,并捕获NumberFormatException - 用户输错时,别直接崩,提示“请输入有效数字”后继续循环
修改学生信息别直接 new Student 覆盖,要定位原对象再 set
常见错误写法:students.set(index, new Student(...))——看似更新了,但如果其他地方还持有旧引用(比如从列表里取出来又存了变量),数据就不同步了。
正确做法是找到原对象,调用 setter:
Student target = findById(id);
if (target != null) {
target.setName(newName);
target.setScore(newScore);
}
- 这样能保证所有引用看到的是同一份数据
- 如果用了不可变对象(
final字段),那才需要替换,但初级项目不推荐 - 注意
findById()返回null时要判空,否则NullPointerException立刻出现
真正容易被忽略的不是功能实现,而是每次 get 之后是否检查了 null,以及每次 parseInt 是否包了异常处理——这两处不补,程序跑三分钟必挂。










