Java学生信息录入问题:重复录入无法存储多组数据
问题分析与修复方案
核心问题点
- 数据覆盖:每次录入时
row都被重置为0,新输入的学生信息直接覆盖之前的记录,根本存不了多组数据。 - 循环混乱:嵌套的
while(in.hasNext())完全多余,控制台输入场景下这个循环会一直阻塞,导致流程卡死。 - switch逻辑错误:
case "yes"后没加break,执行完yes的代码会直接跳到case "no",把yn设为false,直接终止循环,没法继续录入。 - 打印不完整:只打印了第0行的数据,没有遍历所有已录入的学生。
- 冗余代码:
final String toUpperCase;未初始化且无实际用途,属于无效代码。
修复后的完整代码
import java.util.Scanner; public class test3d { public static void main(String[] args) { // 定义二维数组存储学生信息,每行存1个学生的4项数据 String[][] students = new String[50][4]; Scanner in = new Scanner(System.in); String decision = ""; boolean yn = true; // 用row变量跟踪当前录入的学生行号,初始从0开始,每录完一个加1 int row = 0; // 主循环:控制是否继续录入 while (yn) { System.out.println("Enter Student ID Number: "); students[row][0] = in.nextLine(); System.out.println("Enter Student Fullname: "); students[row][1] = in.nextLine(); System.out.println("Enter Student College: "); students[row][2] = in.nextLine(); System.out.println("Enter Student Program: "); students[row][3] = in.nextLine(); System.out.println("Record Successfully Saved"); System.out.print("Do you want to add more? YES/NO "); decision = in.nextLine().toLowerCase(); // 转小写避免大小写判断问题 switch (decision) { case "yes": row++; // 行号加1,准备存下一个学生 break; // 必须加break,避免执行后续case case "no": yn = false; break; default: System.out.println("输入无效,请输入YES或NO"); // 输入错误时不换行号,重新询问 continue; } } // 打印所有学生信息 System.out.println("\nID NUMBER STUDENT NAME COLLEGE PROGRAM "); // 遍历所有已录入的学生行(从0到row) for (int i = 0; i <= row; i++) { System.out.printf("%-13s %-18s %-12s %s%n", students[i][0], students[i][1].toUpperCase(), students[i][2].toUpperCase(), students[i][3].toUpperCase()); } } }
关键修复说明
- 行号跟踪:把
row变量移到主循环外面,每次录入完一个学生后row++,确保新数据存在下一行,不会覆盖旧数据。 - 移除多余循环:删掉嵌套的
while(in.hasNext()),主循环用yn变量控制即可,避免流程阻塞。 - switch修正:给
case "yes"加上break,防止逻辑串到case "no";同时把输入转成小写,兼容用户输入Yes、YES等不同大小写的情况。 - 完整打印:用for循环遍历所有已录入的学生行,用
printf格式化输出,让排版更整齐。 - 添加默认分支:处理用户输入无效的情况,提示后重新询问,避免程序异常。
内容的提问来源于stack exchange,提问作者Jericho Faustino
相关产品推荐
相关产品推荐

