结论:50行内可用ArrayList存学生、Scanner输入、手写统计逻辑实现核心功能;Student类仅含name和score字段,统计代码置于主流程,输入需hasNextDouble()预检+范围校验,平均分用double累加,最高分初始化为NEGATIVE_INFINITY,空列表须单独处理。

直接说结论:用 ArrayList 存学生、Scanner 做输入、手写平均分/最高分逻辑,不依赖数据库或框架,50 行内能跑通核心统计功能。
怎么组织学生数据结构
别一上来就建 Student 类加一堆 getter/setter——初级实战要先跑通逻辑。最简方案是用 String[] 或 Map 存单个学生信息,但后续统计麻烦;推荐直接定义轻量级类:
-
Student类只保留name(String)和score(double),不加构造器也行,用字段赋值更直观 - 用
ArrayList装全体学生,避免数组长度固定带来的扩容判断 - 别在类里塞统计方法(比如
getAverage()),统计逻辑统一放在主流程里,职责清晰,调试时一眼看到数据流
输入成绩时怎么防错
Scanner 读数字最容易崩在 InputMismatchException——用户输“九十五”或直接回车就挂。必须做两层防护:
- 用
scanner.hasNextDouble()预检,不满足就scanner.next()清掉非法输入,否则会死循环 - 成绩范围校验不能只靠提示语,要代码拦截:
if (score 100),并要求重输 - 学生姓名允许空格,但别用
next()(遇空格截断),改用nextLine().trim()
统计逻辑怎么写才不容易算错
平均分、最高分、及格人数这些看似简单,实操中三个坑最多:
立即学习“Java免费学习笔记(深入)”;
- 平均分必须用
double累加再除以人数,别用int求和——95 + 87 + 76 = 258,除以3得86,但实际是86.0,类型错了结果就丢精度 - 最高分初始化别设
0,万一全不及格(如-10, -5)就误判;应设为Double.NEGATIVE_INFINITY或直接用第一个学生成绩 - 及格线写死
>= 60就行,别搞配置化——初级实战里多一个变量反而增加理解成本
输出结果时要注意什么格式问题
控制台输出不是 print 出来就行,用户需要可读性:
- 用
System.out.printf("%.1f", avg)控制小数位,避免平均分显示成86.00000000000001 - 最高分学生姓名和分数要对齐,别一个 println 一个 print 搞乱行——统一用
printf("%-10s %.1f\n", stu.name, stu.score) - 空列表时(没录任何学生)必须单独判断,输出“暂无数据”,否则求平均分会除零异常
真正卡住初学者的往往不是语法,而是输入校验漏分支、平均分用 int 累加、空集合没兜底这三处。把这三块逻辑写结实了,系统骨架就立住了。









