最近要做一个作业,老师给了一个excel表。里面有全班的兴趣统计数据。要求读取里面的数据并进行操作。我本来是想用apache poi来读取,结果却发发生了java.lang.NullPointerException  错误。刚刚学java,很多东西不懂。求指教哪里错了,应该如何改正。真心求教。
PS:源代码分三个类,main函数在JiangClass(班级),还有Student(学生)和Interest(兴趣)。
import java.text.NumberFormat;
import java.io.FileInputStream;
import java.io.IOException;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class JiangClass {
private Student[] students;
private String[] interestsNames;
public JiangClass(int studentCount, String[] interestsNames) {
this.students = new Student[studentCount];
this.interestsNames = interestsNames;
}
public Student[] getStudents() {
return students;
}
public void setStudents(Student[] students) {
this.students = students;
}
public String[] getInterestsNames() {
return interestsNames;
}
public void setInterestsNames(String[] interestsNames) {
this.interestsNames = interestsNames;
}
public void loadDataByPoi(String filePath){
try {
            HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(filePath));
            HSSFSheet sheet = workbook.getSheetAt(0);
            HSSFRow row = null;
            HSSFCell cell = null;
            String cellval;
            for (int i = sheet.getFirstRowNum()+1;  i < sheet.getPhysicalNumberOfRows(); i++) {
                row = sheet.getRow(i);
                this.students[i-1].setName(row.getCell(0).toString());
                this.students[i-1].setName(row.getCell(1).toString());
                for (int j = row.getFirstCellNum()+2; j < row.getPhysicalNumberOfCells(); j++) {
                    cell = row.getCell(j);
                    cellval = cell.toString();
                    int t=Integer.parseInt(cellval);
                    this.students[i-1].interests[j-2].setValue(t);
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } }
public Student getBestFriend(String studentName) {
NumberFormat num = NumberFormat.getPercentInstance();  
num.setMaximumIntegerDigits(3); 
num.setMaximumFractionDigits(2);
Student student = this.getStudentByName(studentName);
System.out.println(studentName+"和全班同学匹配度的排序");
//选择排序
for(int i=0;i<students.length-1;i++){
for(int j=i+1;j<students.length;j++){
if (students[i].getName().equals(studentName)){
continue;
}
if(students[i].getMatchValue(student)>students[j].getMatchValue(student)){
Student t=students[i];
students[i]=students[j];
students[j]=t;
}
}
}


for(int i=0;i<students.length;i++){
if (students[i].getName().equals(studentName)){
continue;
}
System.out.println(students[i].getName()+":"+num.format(students[i].getMatchValue(student)));
}
return students[students.length-1];
}
public Student getStudentByName(String studentName) {
for (int i = 0; i < getStudents().length; i++) {
Student student = getStudents()[i]; if (student.getName().equals(studentName)) {
return student;
}
}
return null;
}
public static void main(String[] args){
String[] interesNames = { "文学", "电影", "爱情" ,"动漫","美食","JAVA","微博","运动","音乐","网络游戏"};
JiangClass cls = new JiangClass(42,interesNames);
cls.loadDataByPoi("d:\\信管学生兴趣统计表.xls");
Student friend = cls.getBestFriend("许健彰");
System.out.println("最匹配的人是: "+friend.getName());

}public class Interest {
private String item;
private int value;
Student student;
public Interest(String item, int value, Student student) {
this.item = item;
this.value = value;
this.student = student;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
public int getValue() {
return value;
}
        public void setValue(int value) {
this.value = value;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
public class Student {
private String name;
private String gender;
    Interest[] interests;
private JiangClass cls;
public Student(String name, String gender,Interest[] interest) {
this.name = name;
this.gender = gender;
this.interests=interest;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Interest[] getInterests() {
return interests;
} public void setInterests(Interest[] interests) {
this.interests = interests;
}
public double getMatchValue(Student other){
double fenmu=(9-1)*this.cls.getInterestsNames().length;
int fenzi=0;
for(int i=0;i<this.cls.getInterestsNames().length;i++){
int v=this.getInterests()[i].getValue()-other.getInterests()     [i].getValue();
v=Math.abs(v);
fenzi=fenzi+v;
}
return 1-fenzi/fenmu;
}

}

解决方案 »

  1.   

    你把报错的那一行就是JiangClass的54行指出来吧
      

  2.   

    吧sheet.getFirstRowNum()和sheet.getPhysicalNumberOfRows()  system.out到控制台看看  应该是这两个获取的行数有问题
      

  3.   

    你贴出的代码的54行和你的错误日志对应不上。一般NullPointException是这么造成的:
    对象object,方法method();如果object为null,那么object.method()这么调用就会出。你可以检查你对应的代码行,确认下object是否是空!空指针异常还是比较容易定位和解决的!
      

  4.   


    this.students[i-1].setName(row.getCell(0).toString());这一行报错
      

  5.   

    debug用过,但是没怎么看懂怎么错的
      

  6.   

    不要以为你new Student[]之后就新建了很多Student对象,其实里面什么也没有,你只是申请了一个联系的内存空间而已。另外,发现你的row.getCell也存在返回为空的情况, 不能再它上面直接调方法
      

  7.   

    我刚学java,很多都不懂,特别是java内存这些。。各位大神把代码复制运行下吧。。以前只学过C,C也没学好...刚接触面向对象,eclipse也不怎么会用,纯菜鸟
      

  8.   

    初始化的话直接在先前错误的那一行前面初始化就可以了,直接加一句this.students[i-1]=new Sturdent().新错误又是什么呢, 
      

  9.   

    先createCell.然后setCellValue试试