J'utilise eclipse et je programme en java. Parfois, je tombe sur une nullPointerException qui me tourmente pendant des heures. Existe-t-il un moyen de mieux déboguer les nullPointerExceptions et de déterminer les valeurs des variables et d'autres choses qui pourraient causer des null Pointer Exceptions.
Réponses
Trop de publicités?Regardez la trace de la pile et lisez le numéro de la ligne où le message NullPointerException
est lancé. Presque toujours, la ligne contient l'invocation d'une méthode telle que
x.getValue()
Si x
es null
vous obtenez un NullPointerException
. Si la méthode en haut de la trace de la pile n'est pas votre code, remontez la pile jusqu'à ce que vous atteigniez votre code. Très souvent dans ce cas, vous passez null
à une méthode qui n'aime pas null
paramètres. Trouvez-le et réparez-le.
De plus, très souvent, lorsque vous rencontrez une méthode qui n'est pas la vôtre et qui lance un NullPointerException
lisez la documentation. Par exemple, regardez String.replace(CharSequence target, CharSequence replacement)
:
Jette :
NullPointerException
- sitarget
oureplacement
esnull
.
On ne peut pas être plus clair que ça !
Voici un exemple :
En regardant la ligne 4, on voit foo.bar()
. Cela implique que foo
es null
. Celui-là est facile. Prenons un autre exemple :
En remontant dans votre code, nous voyons que s.replace(target, replacement)
est en train de lancer. Nous devrions inspecter target
y replacement
. Attachons un débogueur :
Aha ! replacement
es null
. Vous pouvez faire la même chose dans Eclipse. Définissez un point d'arrêt lorsqu'une exception est levée, et utilisez-le pour inspecter les paramètres de votre méthode. Je suis primitif ici parce que je viens d'une école de pensée où je crois sincèrement que tout le monde serait mieux s'il apprenait d'abord à faire les choses de la manière la plus dure. Les abstractions fuyantes et tout ça.
-
Pendant le débogage, vous pouvez utiliser la fonction
BreakPoints
afin de capturer l'image nulle null.Fenêtre -> Afficher la vue -> Points d'arrêt
Dans la vue, il y a un
"J!"
qui vous permet de définir des points d'arrêt sur exceptions. Vous pouvez définirjava.lang.NullPointerException
. Ainsi, une fois que l'exception du pointeur nul est levée, vous pouvez vérifier quelle variable est à l'origine de cette exception. null. -
Une autre chose que vous pouvez faire est de capturer l'accès éventuel à un pointeur nul pendant que vous codez. Bien sûr, vous ne pouvez pas capturer tous les pointeurs nuls en utilisant ce paramètre. Mais cela reste utile, définissez les paramètres suivants dans votre éclipse.
Préférences -> Java -> Compilateur -> Erreurs/alertes -> Analyse des nuls
Il y a plusieurs façons de faire NullPointerException
moins de problème :
-
Utilisez le Annotation @Nullable .
-
Tester les valeurs des arguments pour
null
dans les constructeurs et les setters (évitez les setters dans le bon vieux code Java). Si vous faites cela souvent, vous pouvez créer un modèle de code source (Eclipse) pour générer rapidement le code. C'est ce qu'on appelle le "failfast" - vous n'attendez pas que l'exception soit levée lorsque la valeur est utilisée plus loin dans le code, par exemple après l'avoir stockée dans un champ. -
Veillez à effectuer un nombre minimum (par exemple 1 ou 2) d'opérations par ligne. Si vous ne le faites pas, vous devrez trouver où, dans l'expression à une seule ligne, l'élément
NullPointerException
survenu. -
N'utilisez pas
null
dans les champs pour indiquer l'état. Utilisez plutôt, par exemple, unenum State
. Par exemple, ne pas faireif (socket == null) { // not connected }
car il est facile d'oublier de vérifiernull
plus tard. Un état explicite n'est pas si facile à oublier. -
Ne pas initialiser les variables locales à
null
sauf si cela est explicitement nécessaire. En fait, si vous gérez correctement la portée et les exceptions, vous devriez être en mesure de marquer la plupart des variablesfinal
. Remplacement de l'option par défautprintStacktrace()
méthodes avecthrow new IllegalStateException("Unhandled program state", e)
aide parce qu'il est considéré comme un point de sortie d'un bloc de code.
Après beaucoup de programmation vous trouverez le nombre de NullPointerException
descendent.