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

Java数组输出为null求助:学生及格/不及格数组赋值异常

问题修复方案

代码核心错误点

  1. 赋值逻辑完全颠倒:你原本要把学生姓名存入及格/不及格数组,但代码写反了方向——比如nama[i] = lulus1[i]是用空的及格数组值覆盖学生姓名,正确写法应该是lulus1[i] = nama[i],这就是输出全为null的根本原因。
  2. 最值计算循环范围错误:原循环只遍历前2个元素,既无法正确计算所有学生的分数最值,还会在学生数量小于2时触发数组越界异常,必须遍历整个数组长度。
  3. 输出笔误:原代码中把科目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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:25:20