Java数组输出为null求助:学生及格/不及格数组赋值异常
问题修复方案
代码核心错误点
- 赋值逻辑完全颠倒:你原本要把学生姓名存入及格/不及格数组,但代码写反了方向——比如
nama[i] = lulus1[i]是用空的及格数组值覆盖学生姓名,正确写法应该是lulus1[i] = nama[i],这就是输出全为null的根本原因。 - 最值计算循环范围错误:原循环只遍历前2个元素,既无法正确计算所有学生的分数最值,还会在学生数量小于2时触发数组越界异常,必须遍历整个数组长度。
- 输出笔误:原代码中把科目1的最低分
min1误写为min2,导致显示结果错误。
修复后的完整代码
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package freewill_project; import java.util.Arrays; import javax.swing.JOptionPane; /** * * @author /// */ public class Testing { public static void main(String[] args) { int batas = Integer.parseInt(JOptionPane.showInputDialog("Batas Siswa")); String[] nama = new String[batas]; String mapel1, mapel2; int nilai1[] = new int[batas]; int nilai2[] = new int[batas]; int total1 = 0, total2 = 0, Ttotal; int kkm1, kkm2; String[] tlulus1 = new String[nama.length]; String[] lulus1 = new String[nama.length]; String[] tlulus2 = new String[nama.length]; String[] lulus2 = new String[nama.length]; mapel1 = JOptionPane.showInputDialog("Masukan Mapel 1"); mapel2 = JOptionPane.showInputDialog("Masukan Mapel 2"); kkm1 = Integer.parseInt(JOptionPane.showInputDialog("Input KKM 1")); kkm2 = Integer.parseInt(JOptionPane.showInputDialog("Input KKM 2")); for (int i = 0; i < nama.length; i++) { nama[i] = JOptionPane.showInputDialog("Nama Siswa"); // 处理科目1的分数与及格状态 nilai1[i] = Integer.parseInt(JOptionPane.showInputDialog("Input Nilai " + mapel1)); total1 += nilai1[i]; if (nilai1[i] < kkm1) { tlulus1[i] = nama[i]; // 不及格:存入tlulus1数组 } else { lulus1[i] = nama[i]; // 及格:存入lulus1数组 } // 处理科目2的分数与及格状态 nilai2[i] = Integer.parseInt(JOptionPane.showInputDialog("Input Nilai " + mapel2)); total2 += nilai2[i]; if (nilai2[i] < kkm2) { tlulus2[i] = nama[i]; // 不及格:存入tlulus2数组 } else { lulus2[i] = nama[i]; // 及格:存入lulus2数组 } } Ttotal = total1 + total2; // 修正平均分计算:总分数除以总科目数(学生数×2) int rata = Ttotal / (batas * 2); int max1 = nilai1[0]; int min1 = nilai1[0]; int max2 = nilai2[0]; int min2 = nilai2[0]; // 遍历整个数组计算最值,避免越界和漏算 for (int i = 0; i < batas; i++) { if (max1 < nilai1[i]) { max1 = nilai1[i]; } if (min1 > nilai1[i]) { min1 = nilai1[i]; } if (max2 < nilai2[i]) { max2 = nilai2[i]; } if (min2 > nilai2[i]) { min2 = nilai2[i]; } } // 修正输出内容,明确标注科目名称,修正笔误 System.out.println("Nilai Rata-Rata Keseluruhan: " + rata + "\nNilai Tertinggi " + mapel1 + ": " + max1 + "\nNilai Terendah " + mapel1 + ": " + min1 + "\nNilai Tertinggi " + mapel2 + ": " + max2 + "\nNilai Terendah " + mapel2 + ": " + min2 + "\nSiswa Lulus " + mapel1 + ": " + Arrays.toString(lulus1) + "\nSiswa Tidak Lulus " + mapel1 + ": " + Arrays.toString(tlulus1) + "\nSiswa Lulus " + mapel2 + ": " + Arrays.toString(lulus2) + "\nSiswa Tidak Lulus " + mapel2 + ": " + Arrays.toString(tlulus2)); } }
额外优化说明
- 修正了平均分计算逻辑:原代码用总分数除以2,正确逻辑应为总分数除以(学生数×2),因为每个学生有两门科目的分数。
- 给输入框添加了科目名称提示,用户输入时更清晰。
- 将最值判断的
else if改为独立if,避免出现同时需要更新最大值和最小值的情况被跳过。
内容的提问来源于stack exchange,提问作者GoliathBlast
相关产品推荐
相关产品推荐

