日期:2014-05-20  浏览次数:20747 次

我的程序有个错误请大虾指点指点!!
这是个学员管理程序,目前只写了录入,更显示2部分,但问题就出现在显示(红字那里)那里,错误提示是:
(Exception in thread "main" java.lang.NullPointerException
at net.Student.show(Student.java:56)
at net.Test.main(Test.java:13)
)

代码如下:
package net;

import java.util.Scanner;

public class Student {
int id;
String name;
double[] cj=new double[3];
double avg;

Student(){}

Student(int id,String name,double[] cj){
this.id=id;
this.name=name;
for(int i=0;i<cj.length;i++){
this.cj[i]=cj[i];
}
}

public double avg(double[] cj){
double sum=0;
for(int i=0;i<cj.length;i++){
sum=sum+cj[i];
}
return sum/cj.length;
}

//学员信息录入
public void info(Student[] stu){
Scanner input=new Scanner(System.in);
for(int i=0;i<stu.length;i++){
System.out.println("请输入第"+(i+1)+"学员ID:");
int id=input.nextInt();
System.out.println("请输入第"+(i+1)+"学员姓名:");
String name=input.next();
double[] cj=new double[3];
for(int j=0;j<cj.length;j++){
System.out.println("请输入第"+(j+1)+"门课的成绩:");
cj[j]=input.nextDouble();
}
stu[i]=new Student(id,name,cj);
avg=stu[i].avg(cj);
System.out.println("要继续吗:(y/n)");
if(input.next().equals("n")){
break;
}
}
}

//学员信息显示
public void show(Student[] stu){
System.out.println("学员ID"+"\t\t"+"学员姓名"+"\t\t"+"成绩1"+"\t"+"成绩2"+"\t"+"成绩3"+"\t\t"+"平均成绩");

for(int i=0;i<stu.length;i++){
if(stu[i].id !=0){
System.out.println(stu[i].id+"\t\t"+stu[i].name+"\t\t"+stu[i].cj[0]+"\t"+stu[i].cj[1]+"\t"+stu[i].cj[2]+"\t\t"+this.avg);
}else{
break;
}
}
}
}

下面是测试类:
package net;

public class Test {

public static void main(String[] args) {
// TODO Auto-generated method stub
Student[] stu=new Student[49];
Student person=new Student();
person.info(stu);
person.show(stu);
}

}

------解决方案--------------------
当你没有输入49组数据之前,[要继续吗:(y/n)]选n的时候,
后续的Student是空。所以在运行到哪一条的[if(stu[i].id !=0){ ]时候,会出错。


以下的修改供参考:
将[if(stu[i].id !=0){ ]改成[if (stu != null && stu[i].id != 0) {]。

------解决方案--------------------
Student[] stu=new Student[49];
你定义了一个数组但真正实例化的只有输入的几个所以产生了NULLPOINTER异常。
我把你的程序新包装了下。供参考。
student类:
Java code

package net;

import java.text.DecimalFormat;
import java.util.Scanner;

public class Student {
    int id;
    String name;
    double[] cj = new double[3];
    double avg;

    Student() {
    }

    Student(int id, String name, double[] cj) {
        this.id = id;
        this.name = name;
        for (int i = 0; i < cj.length; i++) {
            this.cj[i] = cj[i];
        }
    }
    public void setAvg(double avg){
        this.avg=avg;
    }
    public String toString(){//重写方法以便于打印出ArrayList中的内容
        DecimalFormat format=new DecimalFormat("#.##");//格式化平均值输出
        return this.id + "\t\t" + this.name + "\t\t"
                        + this.cj[0] + "\t" + this.cj[1] + "\t"
                        + this.cj[2] + "\t\t" + format.format(this.avg);
    }
}