Java成绩计算程序空指针异常排查:数组循环嵌套if语句问题
问题排查:Java成绩计算程序的NullPointerException异常
核心异常原因
抛出NullPointerException的直接原因是GradesAverage类中的grade数组未初始化:
- 在
GradesAverage类中仅声明了String[] grade;,但从未为其分配内存空间(无new String[xxx]初始化操作)。 - 当
computeResults()方法执行grade[i] = "A";这类赋值语句时,grade本身还是null,直接触发空指针异常。
附带的其他逻辑错误
除NPE问题外,代码还有两处关键逻辑漏洞:
- 平均分计算逻辑错误:
当前tally = score[i-1] + score[i];的写法完全错误:- 第一次循环
i=0时,score[i-1]等价于score[-1],会触发数组越界异常。 - 正确累加方式应为
tally += score[i];,且需先将tally初始化为0。
- 第一次循环
- 主类成绩数组初始化不合理:
主类中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); } }
修复说明
- 在
setSubjects()方法中添加grade数组初始化操作,确保数组有足够空间存储每门科目的等级。 - 修正
tally累加逻辑,初始化tally为0后,每次循环累加当前成绩。 - 主类中根据用户输入的科目数动态创建成绩数组,避免固定大小带来的问题。
内容的提问来源于stack exchange,提问作者Zaedriel
相关产品推荐
相关产品推荐

