Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi j'ai NullPointerException ici?

Au lieu de rechercher la cause profonde dans l'obscurité, je pense qu'il est préférable d'expliquer comment et pourquoi les NPE sont causées et comment elles peuvent être évitées, afin que le PO puisse appliquer les connaissances nouvellement acquises pour rechercher son propre problème trivial.

Regardez, les références d'objet (les variables) peuvent contenir soit un Object digne de ce nom ou simplement rien , qui est null .

SomeObject someObject1 = new SomeObject(); // References something.
SomeObject someObject2 = null; // References nothing.

Maintenant, si vous essayez d'accéder à rien (null ), alors vous obtiendrez sans aucun doute une NullPointerException , simplement parce que null n'a pas de variables ou de méthodes.

someObject1.doSomething(); // Works fine.
someObject2.doSomething(); // Throws NullPointerException.

La solution de contournement est assez simple. Cela peut être fait essentiellement de deux manières :soit en l'instanciant, soit simplement en l'ignorant.

if (someObject2 == null) {
    someObject2 = new SomeObject();
}
someObject2.doSomething(); // No NPE anymore!

ou

if (someObject2 != null) {
    someObject2.doSomething(); // No NPE anymore!
}

Dans le cas d'un NPE, le premier numéro de ligne du stacktrace indique la ligne exacte où il a été causé. Vous avez dit littéralement "la ligne 272 est admin.birthList.add(list1); ". Cette ligne contient deux endroits où les références d'objets sont accédées/invoquées (en utilisant le point . opérateur). Le premier étant admin.birthList et le second étant birthList.add(list1) . C'est à vous de découvrir si l'un ou les deux ont causé l'ENP. S'il s'agit du premier appel, alors admin est simplement null . S'il s'agit de la deuxième invocation, alors birthList est simplement null . Vous pouvez le réparer en l'instanciant avec un objet digne de ce nom.

Modifier : Si vous avez du mal à déterminer la cause première (comme il ressort des commentaires), vous devez apprendre le débogage. Exécutez un débogueur ou faites simplement un "débogage du pauvre" à l'aide d'un System.out.println() de chaque variable avant d'y accéder/de les invoquer. Regardez d'abord la ligne où le NPE est causé. Si c'est par exemple

admin.birthList.add(list1);

vous devez alors le modifier comme suit pour déterminer la cause première :

System.out.println("admin: " + admin);
List<Birth> birthList = admin.birthList;
System.out.println("birthList: " + birthList);
birthList.add(list1);

vérifier si l'un d'eux imprime null . Vous pouvez également faire :

if (admin == null) throw new NullPointerException("admin is null!");
List<Birth> birthList = admin.birthList;
if (birthList == null) throw new NullPointerException("birthList is null!");
birthList.add(list1);

vous pouvez également séparer les invocations individuelles sur des lignes séparées afin d'avoir suffisamment de numéro de ligne pour savoir quelle référence est nulle.

List<Birth> birthList = admin.birthList; // If NPE line points here, then admin is null.
birthList.add(list1); // If NPE line points here, then birthList is null.