关于equals方法导致的空指针异常如何解决
一名大一学生,最近有一个简单学生信息管理系统的作业,在运行的时候有一个空指针异常,在网上搜寻了各种解释以及解决办法都没有能够解决,请各位大神帮忙指点一下。为了方便我把所涉及的类都放在了下面,但是出现异常的在第一个类。
ScoreData类
这个类的要求是通过键盘输入若干组学生课程成绩值,每组学生课程成绩值包含(学号,课程号,成绩)三个数据;要求注意学号和课程号和前面的数据保持一致,即,学号和课程号的值必须是StudentData和CourseData中有的数据,如在前两个类中没有,不要加入。
出现的问题是在 if(sid.equals(StudentData.stus[i].getStuNo()))
这一句。
异常为请输入学生的学号:02
请输入课程号:
11
请输入学生成绩:
60
Exception in thread "main" java.lang. NullPointerException
at edu.jxau.ciec.data.ScoreData.main(ScoreData.java:41)
空指针异常
public class ScoreData {
public static Score[] sco=new Score[10];//声明一个Score类型数组
public static int realLength=0;
public static void add(Score scor){//添加数据
sco [realLength] =scor;
realLength++;
}
public static void findAll(){//查找数据
for (int i = 0; i < realLength; i++) {
System.out.println(sco[i]);
}
System.out.println("当前有"+realLength+"个学生数据");
}
public static void main(String[] args) {
System.out.print("请输入学生的学号:");
Scanner SId = new Scanner(System.in);
String sid = SId.nextLine();
System.out.println("请输入课程号:");
Scanner COU = new Scanner(System.in);
int cous = COU.nextInt();
System.out.println("请输入学生成绩:");
Scanner SCO = new Scanner(System.in);
int sco = SId.nextInt();
for(int i=0;i<StudentData.stus.length;i++) {
//遍历“学生数据”数组,stus是学生数据数组名,stus是Student类型
if(sid.equals(StudentData.stus[i].getStuNo())) {
//调用Student类中的getters方法获取“学号”与键盘输入学号作比较
//问题代码句
for(int j=0;j<CourseData.course.length;j++) {
//遍历“课程数据”数组,course是课程数据数组名,course是Course类型
if(cous==CourseData.course[i].getCourseNo()) {
//调用Course类中的getters方法获取“课程号”与键盘输入课程号作比较
ScoreData.add(new Score(sid,cous,sco) );
//信息匹配,可以添加该学生的成绩值
}else break;
}
}
else System.out.println("抱歉,未成功找到该学生,请重新输入信息!");
}
}
}
Student类
public class Student {
private String stuNo;
private String stuName;
private String gender;
private int age;
public Student() { }
public Student(String stuNo, String stuName, String gender, int age) {
this.stuNo = stuNo;
this.stuName = stuName;
this.gender = gender;
this.age = age;
}
@Override
public String toString() {
return "Student [学号:" + stuNo + ",学生姓名 " + stuName + ", 性别" + gender + ", 年龄" + age + "]";
}
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
StudentData类
public static Student[] stus=new Student[10];//声明学生类数组
public static int realLength=0;
public static void add(Student stu){//添加学生成员方法
stus[realLength] =stu;
realLength++;
}
public static void findAll(){//查找所有成员
for (int i = 0; i < realLength; i++) {
System.out.println(stus[i]);
}
System.out.println("当前有"+realLength+"个学生数据");
}
public static void main(String[] args) {
//添加学生成员数据
StudentData.add(new Student("01","Tom","男",20));
StudentData.add(new Student("02","Lily","女",19));
StudentData.add(new Student("03","GAI","男",20));
StudentData.add(new Student("04","Poly","女",18));
StudentData.add(new Student("05","Mary","女",21));
StudentData.add(new Student("06","Smith","男",18));
StudentData.add(new Student("07","Manee","女",19));
StudentData.add(new Student("08","James","男",19));
StudentData.add(new Student("09","Jordan","男",20));
StudentData.add(new Student("10","Taylor","女 ",18));
//查询数据
StudentData.findAll();
}
}
CourseData类
public class CourseData {
public static Course course[]=new Course [3];
public static int realLength=0;
public void add( Course cou){
course [realLength] =cou;
realLength++;
// System.out.println("");
}
public void findAll(){
for (int i = 0; i < realLength; i++) {
System.out.println(course[i]);
}
System.out.println("当前有"+realLength+"个数据");
}
public static void main(String[] args)
{
CourseData cd=new CourseData();
Course c1=new Course("Java",10);
cd.add(c1);
Course c2=new Course("数据结构",11);
cd.add(c2);
Course c3=new Course("高等数学",12);
cd.add(c3);
cd.findAll();
}
}
引起空指针的原因有可能是StudentData.stus[i].getStuNo()中StudentData.stus[i]没有获取到数据,多加几个if语句判断一下看看
这样? if (Optional.ofNullable(StudentData.stus[i].getStuNo()).map(sid::equals).orElse(false)) { }
很简单,如果不想加if判断就使用现成封装好的工具类 Objects.equals() 或者 StringUtils.equals()
数据存储类构造方法对学生类对象提前初始化