J'ai construit une méthode qui compare les attributs des objets avec l'entrée utilisateur int. La méthode ajoute ensuite tous les objets à un tableau (l'affectation exige qu'il s'agisse d'un Array et non d'un ArrayList). Après son ajout, j'ai une boucle de fond qui imprime une liste de résultats pour un athlète (dans l'entrée utilisateur), il imprime tous les résultats d'une catégorie, puis une autre et ainsi de suite.

Je continue à recevoir une erreur NullPointerException sur la dernière ligne qui est un System.out.println. J'ai cherché une réponse pendant des heures et lu les messages de NullPointerException ici, mais je ne peux pas trouver le problème ou le résoudre.

    for (int x = 0; x < category.size(); x++) {
        Category c = categories.get(x);
        System.out.println("Result in " + c.categoryName() + " for " + matchedAthlete.surName() + " "
                + matchedAthlete.lastName() + ": ");
        for (int i = 0; i < individarrayresult.length; i++) {
            Result res = individarrayresult[i];
            if (res.nameOfCategory().equals(c.categoryName())) {
                System.out.println(res.categoryResult());
            }
        }
    }

Donc, la dernière ligne de code (System.out.println) obtient le NullPointerException, je suis désespéré pour obtenir de l'aide. Ci-dessous se trouve le tableau rempli de résultats d'un seul athlète.

     Result[] individarrayresult = new Result[resultlist.size()];

    for (int i = 0; i < resultlist.size(); i++) {
        Result res = resultlist.get(i);
        if (res.athleteStartNumber() == DSN) {
            individarrayresult[i] = res;
        }
    }
1
A.Bohlund 4 janv. 2016 à 19:21

2 réponses

Meilleure réponse

Je pense que vous vous trompez, je pense que vous obtenez le NPE une ligne plus tôt, sur cette ligne:

if (res.nameOfCategory().equals(c.categoryName())) {

Et la raison pour laquelle vous l'obtenez est qu'il y a des null dans votre tableau, à cause de la façon dont vous le remplissez:

Result[] individarrayresult = new Result[resultlist.size()];

for (int i = 0; i < resultlist.size(); i++) {
    Result res = resultlist.get(i);
    if (res.athleteStartNumber() == DSN) {
        individarrayresult[i] = res;
    }
}

Si res.athleteStartNumber() == DSN est faux, vous n'attribuez jamais rien à individarrayresult[i], de sorte que l'entrée du tableau conserve sa valeur par défaut null.

Comment le réparer:

Construisez une liste de résultats correspondants:

List<> individResults = new Arraylist<Result>(resultlist.size());

for (int i = 0; i < resultlist.size(); i++) {
    Result res = resultlist.get(i);
    if (res.athleteStartNumber() == DSN) {
        individResults.add(res);
    }
}

... puis utilisez cette liste directement ou convertissez-la en tableau:

Result[] individarrayresult = individResults.toArray(new Result[individResults.size()]);

... et utilisez le tableau résultant.

(Vous pouvez également faire la même chose avec les nouveaux trucs astucieux de flux dans la dernière version de Java, mais je ne suis pas au courant avec eux ...)


Il est possible, bien sûr, que vous obteniez le NPE sur la ligne que vous avez dit être et qu'il y ait deux problèmes, et il se trouve que vous avez traité toutes les entrées DSN jusqu'à présent. Si tel est le cas, et que vous résolvez l'autre problème, la première fois que vous avez une entrée non DSN, vous rencontrerez ce problème à moins qu'il ne le corrige également.

2
T.J. Crowder 4 janv. 2016 à 16:35

Si vous avez un NullPointerException sur cette ligne:

System.out.println(res.categoryResult());

Le problème est dans la méthode categoryResult car res n'est pas nul , sinon le test précédent

if (res.nameOfCategory().equals(c.categoryName())) {

Doit lever le NullPointerException avant System.out.

Vérifiez donc le code de categoryResult() ou publiez-le.


Peut-être, comme T.J. dit, que le problème n'est pas sur cette ligne mais sur la ligne précédente et que NullPointerException est lié à la valeur de res. Publiez le StackTrace complet et les lignes de ligne de votre code pour être sûr de cette réponse.

3
Davide Lorenzo MARINO 4 janv. 2016 à 16:32