Java do-while循环内数组反复重置、跨if分支读不到变量值如何解决?
问题原因
存储学生姓名、成绩的nama、markah数组定义在do-while循环体内部,每次菜单循环都会重新创建新的空数组,上一轮录入的所有数据都会丢失,所以选择选项3查询时只能拿到空值和默认0值。
调整方案
1. 核心位置修改
- 将
nama、markah数组的声明移动到do-while循环外部,和学生人数变量bilanganpelajar同层级,初始值设为null - 把数组的初始化逻辑放到选项1的代码块中,紧接在用户输入学生人数
bilanganpelajar之后执行,此时已经拿到了数组需要的长度参数,不会出现依赖变量未赋值的问题
2. 其他代码优化点
- 每次录入新学生数据前,清空累加的
ujian1、ujian2、ujian3总分值,避免多次录入数据时总分累加错误 - 增加边界校验:用户未执行选项1录入数据时,选择2、3选项直接提示先录入学生信息,避免空指针异常
- 调整选项3的输出格式,让姓名、成绩和表头对齐显示
修正后完整代码
public static void main(String[] args) { Scanner input = new Scanner(System.in); int bilanganpelajar = 0, pilihan = 0, ujian1 = 0, ujian2 = 0, ujian3 = 0; // 数组声明移到循环外部 int[][] markah = null; String[] nama = null; do { // tunjuk menu menu(); System.out.println("Pilihan anda : "); pilihan = input.nextInt(); if (pilihan == 1) { // bilangan pelajar insert(); bilanganpelajar = input.nextInt(); // 数组初始化移到此处,拿到学生人数后再创建数组 markah = new int[bilanganpelajar][3]; nama = new String[bilanganpelajar]; // 重置总分,避免上次录入的数据累加 ujian1 = 0; ujian2 = 0; ujian3 = 0; // 录入学生信息循环 for(int row = 0; row < bilanganpelajar; row++) { System.out.println("Nama Pelajar : "); nama[row] = input.next(); for (int column = 0; column < 3; column++) { if (column == 0) { System.out.println("Markah Ujian : "); markah[row][column] = input.nextInt(); ujian1 += markah[row][0]; } else if (column == 1) { System.out.println("Markah Pertengahan Tahun : "); markah[row][column] = input.nextInt(); ujian2 += markah[row][1]; } else if (column == 2) { System.out.println("Markah Akhir Tahun : "); markah[row][column] = input.nextInt(); ujian3 += markah[row][2]; } } } } else if (pilihan == 3) { // 增加非空校验,避免空指针异常 if (nama == null || markah == null || bilanganpelajar == 0) { System.out.println("请先选择选项1录入学生信息!"); continue; } System.out.println("Nama Ujian Pertengahan Tahun Akhir Tahun"); for (int row = 0; row < bilanganpelajar; row++) { // 调整输出格式,和表头对齐 System.out.printf("%-8s", nama[row]); for (int column = 0; column < 3; column++) { System.out.printf("%-22d", markah[row][column]); } System.out.println(); } } System.out.println("Terima Kasih!"); } while (pilihan != 4); input.close(); System.out.println("Program Tamat"); }
内容的提问来源于stack exchange,提问作者Harraz Masri
相关产品推荐
相关产品推荐

