请老师指教,怎么避免空指针错误,我每次都是这个错误

请老师指教,怎么避免空指针错误,我每次都是这个错误

package com.imooc.homework4;
public class Student 
{
 private String stuNum;
 private String stuName;
 private float math;
 private float chinese;
 
 public Student()
 {
  
 }
 public Student(String stuNum, String stuName, float math, float chinese) 
 {
  this.setStuNum(stuNum);
  this.setStuName(stuName);
  this.setMath(math);
  this.setChinese(chinese);
 }
 public String getStuNum() 
 {
  return stuNum;
 }
 public void setStuNum(String stuNum) 
 {
  this.stuNum = stuNum;
 }
 public String getStuName() 
 {
  return stuName;
 }
 public void setStuName(String stuName) 
 {
  this.stuName = stuName;
 }
 public float getMath() 
 {
  return math;
 }
 public void setMath(float math) 
 {
  this.math = math;
 }
 public float getChinese()
 {
  return chinese;
 }
 public void setChinese(float chinese) 
 {
  this.chinese = chinese;
 }
 @Override
 public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + Float.floatToIntBits(chinese);
  result = prime * result + Float.floatToIntBits(math);
  result = prime * result + ((stuName == null) ? 0 : stuName.hashCode());
  result = prime * result + ((stuNum == null) ? 0 : stuNum.hashCode());
  return result;
 }
 @Override
 public boolean equals(Object obj) 
 {
  if(this==obj)
  {
   return true;
  }
  if(obj.getClass()==Student.class)// 判断类型
  {
   Student stu = (Student)obj;
   return (stu.getStuNum().equals(stuNum)&&stu.getStuName().equals(stuName));
  }
  return false;
 }
 @Override
 public String toString() {
  return "学生信息: 学号为" + stuNum + ", 姓名为" + stuName + ", 数学成绩为" + math + ", 语文成绩为" + chinese ;
 }
    
}
package com.imooc.homework4;
import java.util.ArrayList;
import java.util.List;
public class BanJi 
{
 private String classId;
 private String className;
 private List<Student> stuList = new ArrayList<Student>();
 
 public BanJi()
 {
  
 }
 
 public BanJi(String classId, String className)
 {
  this.setClassId(classId);
  this.setClassName(className);
  stuList = new ArrayList<Student>();
 }
 public String getClassId() 
 {
  return classId;
 }
 public void setClassId(String classId) 
 {
  this.classId = classId;
 }
 public String getClassName() 
 {
  return className;
 }
 public void setClassName(String className) 
 {
  this.className = className;
 }
 
 public List<Student> getStuList() 
 {
  return stuList;
 }
 public void setStuList(List<Student> stuList) 
 {
  this.stuList = stuList;
 }
 /**
  * 用于添加你想添加的学生。
  * @param stu要添加的学生
  */
 public void addStudent(Student stu1)
 {
  //我们要排除重复添加的情况
  boolean flag = false;
  for(Student stu2:stuList)
  {
   if(stu2.equals(stu1))
   {
    flag = true;
    break;
   }
  }
  if(flag)
  {
   System.out.println("该学生已存在于学生列表中,请不要重复添加!");
  }
  else
  {
   stuList.add(stu1);
      System.out.println("添加成功!");
  }
 }
 
 /**
  * 用于通过学号查询学生信息
  * @param stuNum我们想要查询的学生的学号。
  * @return 我们查询的学生的信息
  */
 public Student searchStudentByNum(String stuNum)
 {
  Student stu1 = null;
  for(Student stu2:stuList)
  {
   if(stu2.getStuNum().equals(stuNum))
   {
    stu1 = stu2;
    break;
   }
  }
  return stu1;
 }
 
 /**
  * 用于录入语文成绩。
  * @param stuNum我们想要输入成绩的学生的学号
  * @param score我们要录入的学生的成绩。
  */
 public void insertChineseScore(String stuNum,float score)
 {
  Student stu1 = searchStudentByNum(stuNum);
  if(stu1!=null)
  {
   stu1.setChinese(score);
  }
  else
  {
   System.out.println("没有找到此学生。");
  }
 }
 
 /**
  * 用于录入数学成绩。
  * @param stuNum我们想要输入成绩的学生的学号
  * @param score我们要录入的学生的成绩。
  */
 public void insertMathScore(String stuNum,float score)
 {
  Student stu1 = searchStudentByNum(stuNum);
  if(stu1!=null)
  {
   stu1.setMath(score);
  }
  else
  {
   System.out.println("没有找到此学生。");
  }
 }
 
 /**
  * 用于删除学生信息
  * @param stuNum我们想要删除的学生的学号
  */
 public void deleteStudent(String stuNum)
 {
  Student stu1 = searchStudentByNum(stuNum);
  if(stu1!=null)
  {
   stuList.remove(stu1);
  }
  else
  {
   System.out.println("没有找到此学生。");
  }
 }
 
 /**
  * 用于显示播放列表中的所有学生。
  */
 public void displayAllStudent()
 {
  System.out.println("班级中的所有学生为:");
  for(Student stu:stuList)
  {
   System.out.println(stu);
  }
 }
 
}
package com.imooc.homework4;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class School
{
 Map<String, BanJi> banJiMap = new HashMap<String, BanJi>();//存放班级的集合。
 public School()
 {
  banJiMap = new HashMap<String, BanJi>();
 }
 public Map<String, BanJi> getBanJiMap() 
 {
  return banJiMap;
 }
    
 public void setBanJiMap(Map<String, BanJi> banJiMap) {
  this.banJiMap = banJiMap;
 }
 /**
  * 用于向学校添加班级
  * @param banji 我们要添加的班级
  */
 public void addBanji(BanJi banji)
 {
  banJiMap.put(banji.getClassName(),banji);
  System.out.println("添加成功!");
 }
  
 /**
  * 用于删除我们想要删除的班级
  * @param banji 我们想要删除的班级
  */
  public void deleteBanji(BanJi banji)
  {
   banJiMap.remove(banji.getClassName());
   System.out.println("删除成功!");
  }
  
  /**
   * 通过班级名称来查询班级
   * @param className 我们需要查询的班级的名称
   * @return 我们查询的班级。
   */
  public BanJi searchByName(String className) 
  {
   BanJi bj = null;
   Set<String> banJiListSet = banJiMap.keySet();
   for(String s:banJiListSet)
   {
    if(s.equals(className))
    {
     bj = banJiMap.get(s);
     break;
    }
   }
   return bj;
  }
  
  /**
   * 用于对语文成绩进行排序
   */
  public void sortChineseByAverage()
  {
   BanJi bj = null;
   Map<String, Float> scoreMap =  new HashMap<String, Float>();
   Set<String> classIdSet = banJiMap.keySet();
   boolean flag = false;
   for(String id : classIdSet)
   {
    bj = this.searchByName(id);
    if(bj.getStuList().isEmpty())
    {
     System.out.println(bj.getClassName()+"中没有学生,请先添加");
     flag = true;
    }
    else
    {
     float sum = 0.0f;
     int i = 0;
     List<Student> studentList = bj.getStuList();
     Iterator<Student> it = studentList.listIterator();//迭代求平均
     while(it.hasNext())
     {
      i++;
      sum = sum + it.next().getChinese();
     }
     float ave = sum/i;
     scoreMap.put(bj.getClassName(), ave);
    }
   }
   if(!flag)
   {
    List<Map.Entry<String, Float>> lm = new ArrayList<Map.Entry<String, Float>>(scoreMap.entrySet());
    Collections.sort(lm, new Comparator<Map.Entry<String, Float>>()
    {
    @Override
    public int compare(Entry<String, Float> o1, Entry<String, Float> o2) 
    {
     return o2.getValue().compareTo(o1.getValue());
    }
    
    });
          System.out.println("各班语文成绩按平均数排列为:");
          for(Map.Entry<String, Float> me : lm)
          {
           System.out.println(me.getKey()+"的语文平均分为:"+me.getValue());
          }
   }
  }
  
  public void sortMathByAverage()
  {
   BanJi bj = null;
   Map<String, Float> scoreMap =  new HashMap<String, Float>();
   Set<String> classIdSet = banJiMap.keySet();
   boolean flag = false;
   for(String id : classIdSet)
   {
    bj = this.searchByName(id);
    if(bj.getStuList().isEmpty())
    {
     System.out.println(bj.getClassName()+"中没有学生,请先添加");
     flag = true;
    }
    else
    {
     float sum = 0.0f;
     int i = 0;
     List<Student> studentList = bj.getStuList();
     Iterator<Student> it = studentList.listIterator();//迭代求平均
     while(it.hasNext())
     {
      i++;
      sum = sum + it.next().getMath();
     }
     float ave = sum/i;
     scoreMap.put(bj.getClassName(), ave);
    }
   }
   if(!flag)
   {
    List<Map.Entry<String, Float>> lm = new ArrayList<Map.Entry<String, Float>>(scoreMap.entrySet());
    Collections.sort(lm, new Comparator<Map.Entry<String, Float>>()
    {
    @Override
    public int compare(Entry<String, Float> o1, Entry<String, Float> o2) 
    {
     return o2.getValue().compareTo(o1.getValue());
    }
    
    });
          System.out.println("各班数学成绩按平均数排列为:");
          for(Map.Entry<String, Float> me : lm)
          {
           System.out.println(me.getKey()+"的数学平均分为:"+me.getValue());
          }
   }
  }
  
  /**
   * 用于显示学校中所有的班级的名称。
   */
  public void displayBanJiName() 
  {
   System.out.println("学校中的所有班级为:");
   Set<String> banJiList = banJiMap.keySet();
   for(String banJi:banJiList )
   {
    System.out.println(banJi);
   }
  }
}
package com.imooc.test;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import com.imooc.homework4.BanJi;
import com.imooc.homework4.School;
import com.imooc.homework4.Student;
public class TestDemo 
{
 public void testDemo()
 {
  Student stu1 = new Student("13号", "张三", 78f, 82.5f);
  Student stu2 = new Student("14号", "李四", 98f, 69.4f);
  Student stu3 = new Student("15号", "王五", 77.8f, 81.5f);
  System.out.println(stu1);
  System.out.println(stu1.equals(stu2));
 }
 
 public void testBanJi(){}
 {
  
  Student stu1 = new Student("13号", "张三", 78f, 82.5f);
  Student stu2 = new Student("14号", "李四", 98f, 69.4f);
  Student stu3 = new Student("15号", "王五", 77.8f, 81.5f);
  Student stu4 = new Student("15号", "王五", 77.8f, 81.5f);
  BanJi bj1 = new BanJi("A003", "1(3)班");
  bj1.addStudent(stu1);
  bj1.addStudent(stu2);
  bj1.addStudent(stu3);
  bj1.addStudent(stu4);
  bj1.displayAllStudent();
  Student stu5 =bj1.searchStudentByNum("14号");
  if(stu5!=null)
  {
   System.out.println("根据学号查询的歌曲信息为");
   System.out.println(stu5);
  }
  else
  {
   System.out.println("该学生不存在。");
  }
  bj1.deleteStudent("15号");
  bj1.displayAllStudent();
  bj1.insertChineseScore("15号", 87f);
  bj1.displayAllStudent();
  bj1.insertMathScore("13号", 99.87f);
  bj1.displayAllStudent();
 }
 public void testSchool()
 {
  Student stu1 = new Student("13号", "张三", 78f, 62.5f);
  Student stu2 = new Student("14号", "李四", 58f, 79.4f);
  Student stu3 = new Student("15号", "王五", 77.8f, 81.5f);
  Student stu4 = new Student("13号", "张六", 78f, 52.5f);
  Student stu5 = new Student("14号", "李七", 95f, 69.4f);
  Student stu6 = new Student("15号", "李八", 77.8f, 81.5f);
  Student stu7 = new Student("13号", "张九", 78f, 82.5f);
  Student stu8 = new Student("14号", "李十", 88f, 69.4f);
  Student stu9 = new Student("15号", "王十一", 77.8f, 51.5f);
  School sc = new School();
  BanJi bj1 = new BanJi("A001", "1(1)班");
  BanJi bj2 = new BanJi("A002", "1(2)班");
  BanJi bj3 = new BanJi("A003", "1(3)班");
  bj1.addStudent(stu1);
  bj1.addStudent(stu2);
  bj1.addStudent(stu3);
  bj2.addStudent(stu4);
  bj2.addStudent(stu5);
  bj2.addStudent(stu6);
  bj3.addStudent(stu7);
  bj3.addStudent(stu8);
  bj3.addStudent(stu9);
  sc.addBanji(bj1);
  sc.addBanji(bj2);
  sc.addBanji(bj3);
  sc.displayBanJiName();
  sc.deleteBanji(bj3);
  sc.displayBanJiName();
  BanJi bj4 = sc.searchByName("1(1)班");
  if(bj4!=null)
  {
  bj4.displayAllStudent();
  }
  else
  {
   System.out.println("没有找到此班级!");
  } 
  sc.sortChineseByAverage();
  sc.sortMathByAverage();
 }
 
 public void mainMenu() 
 {
  System.out.println("******************************");
  System.out.println("          **主菜单**          ");
  System.out.println("          1--班级管理                 ");
  System.out.println("          2--学校管理                 ");
  System.out.println("          0--退出                        ");
 }
 
 public void banJiMenu()
 {
  System.out.println("******************************");
     System.out.println("          班级列表                   ");
  System.out.println("  1--添加学生信息到主学生列表       ");
  System.out.println("  2--添加学生信息到普通班级    ");
  System.out.println("  3--通过学号查询学生信息        ");
  System.out.println("  4--输入班级的语文成绩           ");
  System.out.println("  5--输入班级的数学成绩            ");
  System.out.println("  6--删除学生信息                    ");
  System.out.println("  6--显示所有学生信息              ");
  System.out.println("  9--返回上级菜单               ");
  System.out.println("******************************");
 }
 
 public void schoolMenu()
 {
  System.out.println("******************************");
  System.out.println("           学校列表                     ");
  System.out.println("    1--创建班级                            ");
  System.out.println("    2--删除班级                            ");
  System.out.println("    3--通过班级名称查询班级信息     ");
  System.out.println("    4--对各班语文成绩平均分进行由大到小排序     ");
  System.out.println("    5--对各班数学成绩平均分进行由大到小排序                ");
  System.out.println("    6--显示所有班级名称         ");
  System.out.println("    9--返回上级菜单            ");
  System.out.println("******************************");
 }
 
 public void test()
 {
  TestDemo td = new TestDemo();
  Scanner sc = new Scanner(System.in);
  int input1=0, input2=0, input3=0;
  School banJiList = new School();
  BanJi mainStuList = new BanJi("0000", "主学生列表");
  banJiList.addBanji(mainStuList);
  while(true)
  {
   td.mainMenu();
   System.out.println("请输入对应数字进行操作");
   input1 = sc.nextInt();
   if(input1==0)
   {
    break;
   }
   switch(input1)
   {
   case 1:
    while(true)
    {
     td.banJiMenu();
     System.out.println("请输入对应数字进行操作");
     input2 = sc.nextInt();
     if(input2==9)
     {
      break;
     }
     switch(input2)
     {
     case 1:
      System.out.println("添加学生信息到主学生列表中");
      System.out.println("请输入要添加的学生个数");
      try
      {
       int m = sc.nextInt();
       if(m<0)
       {
        System.out.println("您输入的数字有误,请重新输入。");
       }
       else
       { 
              for(int i=1; i<=m; i++)
              {
               Student stu1 = new Student();
         System.out.println("请输入第" + i +"个学生信息");
         System.out.println("请输入学生ID");
         String id = sc.next();
         stu1.setStuNum(id);
         System.out.println("请输入学生姓名");
         String name = sc.next();
         stu1.setStuName(name);
         mainStuList.addStudent(stu1);
        }
              System.out.println("主学生列表中信息为");
              List<Student> stuList = mainStuList.getStuList();
        for(Student stu : stuList)
        {
         System.out.println("学生信息:[学号:" + stu.getStuNum() + ",姓名:" +  stu.getStuName() + "]");
        } 
       }
      }
      catch(InputMismatchException e)
      {
       System.out.println("请输入正确的数字");
       String s = sc.next();
      }
      
      break;
     case 2:
      System.out.println("添加学生信息到普通班级 ");
      System.out.println("请输入要添加的班级名称");
      try
      {
       BanJi bj1 = null;
       String className = sc.next();
       Set<String> banJiNameSet = banJiList.getBanJiMap().keySet();
       for(String s : banJiNameSet)
       {
        if(s.equals(className))
        {
         System.out.println("请输入要添加的学生个数");
         int stuNumber = 0;
            stuNumber = sc.nextInt();
         if(stuNumber<0)
         {
          System.out.println("您输入的数字有误,请重新输入。");
         }
         else
         {
          for(int i=1 ; stuNumber<=i; i++)
          {
           System.out.println("请输入要添加的学生ID");
           String id =null;
           id = sc.next();
           Student stu1;
              stu1 = mainStuList.searchStudentByNum(id);
           if(stu1 != null)
           {
           bj1 = banJiList.searchByName(s);
           bj1.addStudent(stu1);
           }
           else
           {
            System.out.println("该学生信息在主学生列表中不存在,请输入学生的其他信息。");
            System.out.println("请输入要添加的学生姓名");
            String stuName = sc.next();
            List<Student> stuList = mainStuList.getStuList();
            for(Student stu2 : stuList)
            {
             if(stu2.getStuName().equals(stuName))
             {
              bj1 = banJiList.searchByName(s);
              bj1.addStudent(stu2);
             }
             else
             {
              System.out.println("该学生信息在主学生列表中不存在");
             }
            }
           }
          }
         }
         System.out.println("主学生列表:");
         List<Student> stuList = mainStuList.getStuList();
         for(Student stu3 : stuList)
         {
          System.out.println("学生信息:[学号:" + stu3.getStuNum() + ",姓名:" +  stu3.getStuName() + "]");
                                    }
         System.out.println(bj1.getClassName() + "班级列表");
         List<Student> stuList2 = bj1.getStuList(); 
         for(Student stu4 : stuList2)
         {
          System.out.println("学生信息:[学号:" + stu4.getStuNum() + ",姓名:" +  stu4.getStuName() + "]");
         } 
        }
        else
        {
         System.out.println("未查询到此班级!");
        }
       }
      }
      catch(InputMismatchException e)
      {
       System.out.println("请输入正确的数字");
       String s = sc.next();
       continue;
      }
      break;
     case 3:
      System.out.println("录入语文成绩");
      break;
     case 4:
      System.out.println("录入数学成绩");
      break;
     case 5:
      System.out.println("删除学生信息");
      break;
     case 6:
      System.out.println("显示列表中所有学生");
      break;
      
     default:
      System.out.println("请输入指定的数字");
      break;  
     }
    }
    break;
    
   case 2:
    while(true)
    {
     td.schoolMenu();
     System.out.println("请输入对应数字进行学校列表管理");
     input3 = sc.nextInt();
     if(input3==9)
     {
      break;
     }
     switch(input3)
     {
     case 1:
      System.out.println("向学校中添加班级");
      System.out.println("请输入班级编号");
      try
      {
      String classId = sc.next();
      System.out.println("请输入班级名称");
         String className = sc.next();
         BanJi s = banJiList.searchByName(className);
         if(s != null)
         {
          System.out.println("班级已存在,请重新输入");
      }
         else
         {
          mainStuList = new BanJi(classId, className);
          banJiList.addBanji(mainStuList);
         }
         }
      catch(InputMismatchException e)
      {
       System.out.println("请输入正确的数字");
       String s = sc.next();
      }
      break;
      
     case 2:
      System.out.println("从学校中删除班级! ");
      System.out.println("请输入班级名称");
      try
      {
      String className = sc.next();
      BanJi bj = banJiList.searchByName(className);
      if(bj != null)
      {
       banJiList.deleteBanji(bj);
      }
      else
      {
       System.out.println("班级不存在,请重新输入!");
      }
      }
      catch(InputMismatchException e)
      {
      System.out.println("请输入正确的数字");
      String s = sc.next();
      break;
      }      
      break;
      
     case 3:
      System.out.println("通过班级名称查询班级信息");
      System.out.println("请输入班级名称!");
      String className = sc.next();
      BanJi bj = banJiList.searchByName(className);
      if(bj != null)
      {
       System.out.println("班级信息:[" + bj.getClassId() + ",班级名称:" + bj.getClassName());
      }
      else
      {
       System.out.println("没有查询到相关班级,请重新输入!");
      }
      break;
      
     case 4:
      System.out.println("对各班语文成绩平均分进行由大到小排序");
      Set<String> banJiSet1 = banJiList.getBanJiMap().keySet();
      if(banJiSet1 != null)
      {
      banJiList.sortChineseByAverage();
      }
      else
      {
       System.out.println("您还没有输入班级,请先输入班级");
      }
      break;
      
     case 5:
      System.out.println("对各班数学成绩平均分进行由大到小排序 "); 
      Set<String> banJiSet2 = banJiList.getBanJiMap().keySet();
      if(banJiSet2 != null)
      {
      banJiList.sortMathByAverage();
      }
      else
      {
       System.out.println("您还没有输入班级,请先输入班级");
      }
      break;
      
     case 6:
      System.out.println("显示所有班级名称");
      banJiList.displayBanJiName();
      break;
      
     default:
      System.out.println("请输入指定的数字");
      break;
     }
    }
    break;
    
   default:
    System.out.println("请输入指定的数字");
    break;
   }
  }
 }
 
 public static void main(String[] args) 
 {
  TestDemo ts = new TestDemo();
  //Scanner so = new Scanner(System.in);
  //ts.testDemo();
  //ts.testBanJi();
        //ts.testSchool();
  ts.test();
 }
}

请老师指教,像普通班级添加学生时,为什么明明有班级,也会反馈为查询到此班级。还有为什么会直接跳过录入学生的过程

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,使用的变量bj1初始化是null,所以导致报空指针异常。则建议同学调用searchByName()方法,查看班级是否存在,存在则进行添加。具体实现思路:

    先判断班级是否存在,判断班级存在后,输入要添加的学生数量。然后输入的学生编号,当学生编号在主学生列表中存在时,直接添加到普通班级中。 当输入的学生编号在主学生列表中不存在时,提示不存在要求输入学生姓名。参考代码如下所示:

http://img1.sycdn.imooc.com//climg/5ed1f67e09efc84407790877.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 慕仰7036876 提问者 #1
    老师,我还想问一下。为什么我的程序在班级不存在时会出现两次此班级不存在,以及为什么在我的程序中直接跳过了添加学生的环节,直接显示主学生和班级列表的信息。
    2020-05-30 19:38:52
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师