0

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

下面是主要方法:

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

4 回答 4

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() 方法应该是静态的。如果您想使用类变量,所有其他方法都应该是您的类的一部分。

于 2013-05-12T04:45:37.420 回答
2

您通过在内部重新声明它来隐藏您的类数组parseGolferData()。您初始化的数组是函数的本地数组,而不是类数组。所以当你在里面访问它时,printResults()你会得到一个NullPointerException.

改变这个...

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

golfList = new Golfer[secondSplit.length];
于 2013-05-12T04:45:47.520 回答
1

信息有限,但...

golfList在本地定义parseGolferData

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

这意味着一旦方法存在,引用就会丢失。这表明golfList已经在 else where 声明了,否则 in 中的语句printResults会导致编译器错误。

看起来你正在隐藏你的变量。golfList尝试将in的初始化更改parseGolferData为看起来更像...

golfList = new Golfer[secondSplit.length];

反而。事实上,在这个方法中初始化的所有数组都可能遇到同样的问题。

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

于 2013-05-12T04:47:04.700 回答
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() + " | ");
    }
于 2013-05-12T04:48:15.013 回答