public void showAllStudentsInfo()
{
for(i=0;i<a.length;i++)
{ a[i].showStudentInfo();}
}
中a[i].showStudentInfo();有一个a[i]的值为null了,看看哪一个。
前面加上System.out.println(a[i]);
{
for(i=0;i<a.length;i++)
{ a[i].showStudentInfo();}
}
中a[i].showStudentInfo();有一个a[i]的值为null了,看看哪一个。
前面加上System.out.println(a[i]);
解决方案 »
- java工程里面的package.hmtl文件作用
- request 和 response跳转意义?
- java +sql sever 2000问题??
- 请教JAVA调用DLL问题
- 请教一道基础题,我刚学不会!
- 金额转换,阿拉伯数字的金额转换成中国传统的形式
- File 高人请进 --> 如何将新建文件存放到指定的新建目录下, 文件和目录已创建, 就是不知道该怎么放
- 关于note:configDgj.java uses or overrides a deprecated Api的问题?
- 建一个聊天室这样的机器配置能承受多少人
- JBuilder初学者求教
- 一个File的问题
- 新手提问几个最基础的问题,别见笑啊!!!
在addStudent 中把i 换成studentNum
在showAllStudentsInfo中用:
for(int i=0;i<studentNum;i++)
另外你的其他函数中用到a.length 的,大部分都应该该为 stundentNum
{
for(i=0;i<a.length;i++)
{ a[i].showStudentInfo();}
}此时,a.length是200,而不是你设想的3
所以到了a[3]就是空指针了,再调用showStudentInfo就会出错
修改后的源代码:
//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(); //一个没有注册的学生名字, 也会出现错误, 这是为什么呢?? 请指教!!
2 在没有注册的情况下,searchStudent会返回 null,
c.searchStudent(90).showStudentInfo() 实际上就是null.showStudentInfo(), 当然会出错。
建议加个判断:
AbstractStudent s = searchStudent(90);
if( s != null) .showStudentInfo();
else
{
System.out.println("Student not found");
}