You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:42:01