Java空指针异常

时间:2013-05-12 04:42:10

标签: java arrays object pointers nullpointerexception

我得到一个空指针异常,我想不出如何修复。有问题的数组是一个类数组,应该可以被使用它的方法访问。

这是主要方法:

static Golfer[] golfList;
static Course currentCourse;

public static void main(String[] args) {
    System.out.println("Testing data integrity.  Printing files:");
    String golferData = readFile("scores.txt");
    String courseData = readFile("course.txt");
    parseGolferData(golferData);
    parseCourseData(courseData);
    printResults();
}

以下是创建和填充golfLlist数组的方法

public static void parseGolferData(String golfFileData){
    String[] firstSplit = golfFileData.split("\\\n");
    String[] secondSplit = firstSplit[1].split(", ");
    Golfer[] golfList = new Golfer[secondSplit.length];
    for (int i = 0; i < secondSplit.length; i++){
        System.out.println(secondSplit[i]);
        golfList[i] = new Golfer(secondSplit[i], 18);
        golfList[i].getName();
    }

    for (int i = 2; i<firstSplit.length; i++){
        String[] split = firstSplit[i].split(", ");
        for (int j = 0; j<split.length-1; j++){
            golfList[j].setScore(i-1, Integer.parseInt(split[j].replace(",","")));
        }
    }
}

以下是生成异常的方法(行号是golfList [i]

的第一个实例
public static void printResults(){
    System.out.print("| Par | ");

    for (int i = 0; i<golfList.length; i++){
        System.out.print(golfList[i].getName() + " | ");
    }
    System.out.println(); // spacing
    for (int i = 0; i<18; i++){
        System.out.print("| " + currentCourse.getPar(i+1) + " | ");
        for (int j = 0; j < golfList.length; j++){
            System.out.print(golfList[i].getScore(i+1) + " | ");
        }
    }

    System.out.println(); // spacing
    System.out.print("| " + currentCourse.totalPar() + " | ");
    for (int i = 0; i < golfList.length; i++){
        System.out.print(golfList[i].getTotal() + " | ");
    }
    System.out.println(); // spacing
    System.out.print("|   | ");
    for (int i = 0; i < golfList.length; i++){
        System.out.print((golfList[i].getTotal() - currentCourse.totalPar()) + " | ");
    }
}

与此设置非常相似的东西适用于另一个程序,我很困惑为什么它在这里不起作用。我正在考虑重写它以将数组传递给方法,但这需要大规模的重组,我真的不想这样做。

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

  

有问题的数组是一个类数组,

这些数组都是本地数组:

String[] firstSplit = golfFileData.split("\\\n");
String[] secondSplit = firstSplit[1].split(", ");
Golfer[] golfList = new Golfer[secondSplit.length];

如果您将这些数组定义为类数组,那么您的代码应为:

firstSplit = golfFileData.split("\\\n");
secondSplit = firstSplit[1].split(", ");
golfList = new Golfer[secondSplit.length];

我也看到太多静态方法。只有main()方法应该是静态的。如果你想使用类变量,所有其他方法应该是你的类的一部分。

答案 1 :(得分:2)

您通过在parseGolferData()内重新声明它来隐藏您的类数组。初始化的数组是函数的本地数组,而不是类数组。因此,当您在printResults()内访问它时,您会获得NullPointerException

改变这个......

Golfer[] golfList = new Golfer[secondSplit.length];

golfList = new Golfer[secondSplit.length];

答案 2 :(得分:1)

信息有限,但......

golfListparseGolferData

内本地定义
Golfer[] golfList = new Golfer[secondSplit.length];

意味着一旦方法存在,引用就会丢失。这表明golfList已经被声明为其他地方,否则printResults中的语句会导致编译错误。

看起来你正在隐藏你的变量。尝试更改golfListparseGolferData的初始化,使其看起来更像......

golfList = new Golfer[secondSplit.length];

相反。实际上,在此方法中初始化的所有数组可能都会遇到同样的问题。

您可以解决此问题,正如您所说,将数组引用作为参数传递给其他方法...

答案 3 :(得分:1)

除了其他人所说的,每当你做任何事情时:

 for (int i = 0; i<golfList.length; i++)
    {
        System.out.print(golfList[i].getName() + " | ");
    }

你应该这样做:

 for (int i = 0; i<golfList.length; i++)
    {   
        if(golfList[i] != null)
        System.out.print(golfList[i].getName() + " | ");
    }