public void showAllStudentsInfo()
    {
     for(i=0;i<a.length;i++) 
      { a[i].showStudentInfo();}       
      
    }
中a[i].showStudentInfo();有一个a[i]的值为null了,看看哪一个。
前面加上System.out.println(a[i]);

解决方案 »

  1.   

    你的成员变量 i 用来记录多少学生被add 进来了,但在showAllStudentsInfo你又把它置0了,并且你用a.length 做循环中止值,是不对的,因为数组a中并不是所有的值都赋了。建议把int i = 0 改成 int studentNum = 0;
    在addStudent 中把i 换成studentNum
    在showAllStudentsInfo中用:
    for(int i=0;i<studentNum;i++) 
    另外你的其他函数中用到a.length  的,大部分都应该该为 stundentNum
      

  2.   

    public void showAllStudentsInfo()
        {
         for(i=0;i<a.length;i++) 
          { a[i].showStudentInfo();}
          
        }此时,a.length是200,而不是你设想的3
    所以到了a[3]就是空指针了,再调用showStudentInfo就会出错
      

  3.   

    请请几位的帮助, 修改以后根本上是没有问题了, 但还有两个小问题, 希望可以问到底, 多学点东西. 
    修改后的源代码: 
    //ConcreteStudentManager.javapublic class ConcreteStudentManager extends AbstractStudentManager{
      public ConcreteStudentManager() {}AbstractStudent[] a= new AbstractStudent[200];
      
    int studentNum=0;public boolean addStudent(AbstractStudent student) 
     { 
       if(studentNum<200)
       {
            a[studentNum]=student;
            studentNum++;
            } 
             return true; 
               
      } 
      
     public AbstractStudent removeStudent(int studentID)
     {      AbstractStudent c=null;
            int n;
            int j;
       for(n=0;n<=studentNum;n++)
       {
        if(a[n]._studentID==studentID) 
        {    c=a[n];
             System.out.println("Deleted StudentID:"+a[n]._studentID);
           for(j=n;j<studentNum;j++)
             {
              a[j]=a[j+1];
              }
                studentNum--;
                break;
             
                  }
          
       }
         
         return c;
      }
      
      public AbstractStudent searchStudent(String name)
       {   int searchName;
            AbstractStudent c=null;
          for(searchName=0;searchName<studentNum;searchName++) 
           {
                if(name==a[searchName]._name)
                {
                  System.out.println("Search Result:");
                  return a[searchName];
               
                } 
                break;
              
           }
         
            return c ;
          
        }
        
         public AbstractStudent searchStudent(int studentID)
       {   int m; 
           AbstractStudent d=null;
           for(m=0;m<studentNum;m++)
           {
              if(studentID==a[m]._studentID)
                {   System.out.println("Search Result:");
                 return a[m];
                 
                 }
                 break;
           
            }
            
          
              
            return d;
        }
        
        public void showAllStudentsInfo()
        {
         for(int i=0;i<studentNum;i++) 
          { a[i].showStudentInfo();}
           
          
        }
        
       public static void main(String[] args)
        {    GraStudent a=new GraStudent("Fyu", 20, 9103, "CS");
             BachlorStudent b =new BachlorStudent("Fy", 20, 103, "CS");
             BachlorStudent d =new BachlorStudent("wong", 30, 104, "PP");
             Teacher t = new Teacher("LiFang", "Java", "CS", "Professor");
                 Time y = new Time(2002,9);
                  a.setTeacher(t);
                  a.setEnrollmentYear(y);
                  b.setEnrollmentYear(y);
                  d.setEnrollmentYear(y);
                  
                ConcreteStudentManager c = new ConcreteStudentManager();
                c.addStudent(a);
                 c.addStudent(b);
                 c.addStudent(d);
                 c.searchStudent(9103).showStudentInfo();
               // c.searchStudent(90).showStudentInfo();  //这句话一打开就出问题
                 c.removeStudent(9103);
                c.showAllStudentsInfo();
                
         }
         
    }问题(1): 在removeStudent() 里面, 为什么在studentNum--; 后, 一定要break;呢 (不写break 就出错误)
    问题(2): 在main() 里面, c.searchStudent(90).showStudentInfo();  是一个没有注册的学号, 当我一打开这一语句, 程序运行时就会出错, 照理应该不会出错的吧?? 为什么会出错呢? 同样地如果我用 c.searchStudent("jk").showStudentInfo(); //一个没有注册的学生名字, 也会出现错误, 这是为什么呢?? 请指教!! 
      

  4.   

    1  for(n=0;n<=studentNum;n++) 改为 for(n=0;n<studentNum;n++)
    2 在没有注册的情况下,searchStudent会返回 null, 
    c.searchStudent(90).showStudentInfo() 实际上就是null.showStudentInfo(), 当然会出错。
    建议加个判断:
    AbstractStudent s = searchStudent(90);
    if( s != null) .showStudentInfo();
    else 
    {
        System.out.println("Student not found");
    }
      

  5.   

    这样判断的话, 如果searchStudent() 不是90 , 是其他呢???