我得到一个空指针异常,我想不出如何修复。有问题的数组是一个类数组,应该可以被使用它的方法访问。
这是主要方法:
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()) + " | ");
}
}
与此设置非常相似的东西适用于另一个程序,我很困惑为什么它在这里不起作用。我正在考虑重写它以将数组传递给方法,但这需要大规模的重组,我真的不想这样做。
感谢您的帮助。
答案 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)
信息有限,但......
golfList
在parseGolferData
Golfer[] golfList = new Golfer[secondSplit.length];
意味着一旦方法存在,引用就会丢失。这表明golfList
已经被声明为其他地方,否则printResults
中的语句会导致编译错误。
看起来你正在隐藏你的变量。尝试更改golfList
中parseGolferData
的初始化,使其看起来更像......
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() + " | ");
}