Exceptions de pointeur Null Java [dupliquer]


Cette question a déjà une réponse ici:

Je reçois une exception de pointeur null que je ne peux pas penser à corriger. Le tableau en question est un tableau de classe et devrait être accessible à la méthode qui l'utilise.

Voici le principal méthode:

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();
}

Voici la méthode qui crée et remplit le tableau 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(",","")));
        }
    }
}

Voici la méthode qui génère l'exception (le numéro de ligne est la première instance de 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()) + " | ");
    }
}

Quelque chose de très similaire à cette configuration a bien fonctionné pour un autre programme, et je ne sais pas pourquoi cela ne fonctionnera pas ici. J'envisage de le réécrire pour passer le tableau dans les méthodes, mais cela nécessiterait une restructuration massive et je ne veux pas vraiment avoir à le faire que.

Merci pour votre aide.

Author: Andrew Thompson, 2013-05-12

4 answers

Le tableau en question est un tableau de classe,

Ces tableaux sont tous des tableaux locaux:

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

Si vous avez défini ces tableaux comme des tableaux de classe, votre code devrait être:

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

Je vois aussi trop de méthodes statiques. Seule la méthode main() doit être statique. Toutes les autres méthodes devraient faire partie de votre classe si vous souhaitez utiliser des variables de classe.

 3
Author: camickr, 2013-05-12 04:45:37

Vous observez votre tableau de classe en le redéclarant à l'intérieur de parseGolferData(). Le tableau que vous initialisez est local pour fonctionner, et non un tableau de classe. Ainsi, lorsque vous accéder à l'intérieur de printResults() vous obtenez NullPointerException.

Changer cela ...

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

À

golfList = new Golfer[secondSplit.length];
 2
Author: vidit, 2013-05-12 04:51:25

Il y a peu d'informations, mais...

golfList est définie localement dans parseGolferData

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

Ce qui signifie qu'une fois que la méthode existe, la référence est perdue. Cela suggérerait que golfList a déjà été déclaré autrement où, autrement, l'instruction dans printResults provoquerait une erreur du compilateur.

Il semblerait que vous observiez vos variables. Essayez de changer l'initialisation de golfList dans parseGolferData pour ressembler davantage...

golfList = new Golfer[secondSplit.length];

À la place. En fait, tous les tableaux initialisé dans cette méthode souffrent probablement du même problème.

Vous pouvez résoudre ce problème en, comme vous le dites, en passant les références de tableau en tant que paramètres aux autres méthodes...

 1
Author: MadProgrammer, 2013-05-12 04:53:26

En plus de ce que les autres ont dit, chaque fois que vous faites quelque chose comme:

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

Vous devriez faire:

 for (int i = 0; i<golfList.length; i++)
    {   
        if(golfList[i] != null)
        System.out.print(golfList[i].getName() + " | ");
    }
 1
Author: Steve P., 2013-05-12 04:55:26