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

Java成绩计算程序空指针异常排查:数组循环嵌套if语句问题

问题排查:Java成绩计算程序的NullPointerException异常

核心异常原因

抛出NullPointerException的直接原因是GradesAverage类中的grade数组未初始化:

  • 在GradesAverage类中仅声明了String[] grade;,但从未为其分配内存空间(无new String[xxx]初始化操作)。
  • 当computeResults()方法执行grade[i] = "A";这类赋值语句时,grade本身还是null,直接触发空指针异常。

附带的其他逻辑错误

除NPE问题外,代码还有两处关键逻辑漏洞:

  1. 平均分计算逻辑错误:
    当前tally = score[i-1] + score[i];的写法完全错误:
    • 第一次循环i=0时,score[i-1]等价于score[-1],会触发数组越界异常。
    • 正确累加方式应为tally += score[i];,且需先将tally初始化为0。
  2. 主类成绩数组初始化不合理:
    主类中int[] score = new int[10];固定数组大小为10,应根据用户输入的科目数动态创建数组,避免内存浪费或越界风险。

修复后的代码示例

修复后的GradesAverage类

public class GradesAverage{
    private int subjects;
    private int[] score;
    private String[] grade; // 改为private,符合封装原则
    private int avg;
    private int tally;

    public GradesAverage(){
    }

    public void setSubjects(int subjects){
        this.subjects = subjects;
        // 初始化grade数组,大小与科目数一致
        this.grade = new String[subjects];
    }

    public void setScore(int[] score){
        this.score = score;
    }

    public void computeResults(){
        tally = 0; // 初始化累加器
        for(int i=0; i<subjects; i++){
            if(score[i] >= 90 && score[i] <= 100){
                grade[i] = "A";
            } else if(score[i] >= 80 && score[i] < 90){
                grade[i] = "A-";
            } else if(score[i] >= 70 && score[i] < 80){
                grade[i] = "B";
            } else if(score[i] >= 60 && score[i] < 70){
                grade[i] = "B-";
            } else if(score[i] >= 50 && score[i] < 60){
                grade[i] = "C";
            } else if(score[i] >= 40 && score[i] < 50){
                grade[i] = "D";
            } else if(score[i] >= 0 && score[i] < 40){
                grade[i] = "F";
            } else{
                grade[i] = "ERROR";
            }
            tally += score[i]; // 正确累加成绩
        }
        avg = tally / subjects;
    }

    public int[] getScore(){
        return score;
    }

    public String[] getGrade(){
        return grade;
    }

    public int getAverage(){
        return avg;
    }
}

修复后的GradesAverageApp主类

import java.util.*;
public class GradesAverageApp{
    public static void main(String[] args){
        int subjects = 0;
        int[] score; // 先声明,后续动态初始化
        int avg;
        String[] grade;

        Scanner keyboard = new Scanner(System.in);
        GradesAverage g = new GradesAverage();

        System.out.println("Please enter how many subjects you are taking");
        subjects = keyboard.nextInt();
        score = new int[subjects]; // 根据科目数动态创建数组
        for(int i=0; i<subjects; i++){
            System.out.println("Please enter the score (0-100) for subject #" + (i+1));
            score[i] = keyboard.nextInt();
        }

        g.setSubjects(subjects);
        g.setScore(score);
        g.computeResults();

        grade = g.getGrade();
        avg = g.getAverage();

        for(int i=0; i<subjects; i++){
            System.out.println("You scored " + score[i] + " in subject #" + (i+1) + ", giving you a final grade of " + grade[i] + ".");
        }
        System.out.println("Your overall average score was " + avg);
    }
}

修复说明

  1. 在setSubjects()方法中添加grade数组初始化操作,确保数组有足够空间存储每门科目的等级。
  2. 修正tally累加逻辑,初始化tally为0后,每次循环累加当前成绩。
  3. 主类中根据用户输入的科目数动态创建成绩数组,避免固定大小带来的问题。

内容的提问来源于stack exchange,提问作者Zaedriel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:20:36