web-dev-qa-db-fra.com

Un bon moyen de déboguer nullPointerException

J'utilise Eclipse et je programme en Java. Parfois, je tombe sur une exception nullPointerException qui me tourmentera pendant des heures. Existe-t-il de toute façon de mieux déboguer nullPointerExceptions et de déterminer quelles sont les valeurs des variables et d'autres choses qui provoqueraient des exceptions de pointeur null.

19
Noah Huppert

Regardez la trace de la pile et lisez le numéro de ligne où le NullPointerException est jeté. Presque toujours, la ligne a une invocation de méthode comme

x.getValue()

Si x est null, vous obtenez un NullPointerException. Si la méthode en haut de la trace de la pile n'est pas votre code, tracez la pile complètement jusqu'à ce que vous atteigniez votre code. Très souvent dans ce cas, vous passez null à une méthode qui n'aime pas les paramètres null. Trouvez-le et corrigez-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) :

Lance :

NullPointerException - si target ou replacement est null.

Ce n'est pas beaucoup plus clair que ça!

Voici un exemple:

enter image description here

En regardant la ligne 4, nous voyons foo.bar(). Cela implique que foo est null. Celui-là est facile. Regardons un autre exemple:

enter image description here

En remontant à votre code, nous voyons que s.replace(target, replacement) est en train de lancer. Nous devons inspecter target et replacement. Attachons un débogueur:

enter image description here

Ah! replacement est null. Vous pouvez faire la même chose dans Eclipse. Définissez un point d'arrêt pour le moment où 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 vraiment que tout le monde serait mieux s'il apprenait à le faire à la dure d'abord. Des abstractions qui fuient et tout ça.

24
jason
  1. Pendant le débogage, vous pouvez utiliser la vue BreakPoints pour capturer les pointeurs nuls.

    Fenêtre -> Afficher la vue -> Points d'arrêt

    Dans la vue, il y a "J!" qui vous permet de définir des points d'arrêt sur les exceptions. Vous pouvez définir Java.lang.NullPointerException. Ainsi, une fois que l'exception de pointeur null est levée, vous pouvez vérifier quelle variable est à l'origine de null.

  2. Vous pouvez également capturer un accès possible à un pointeur nul pendant le codage. Bien sûr, vous ne pouvez pas capturer tous les pointeurs Null en utilisant ce paramètre. Mais toujours utile, définissez les paramètres suivants dans votre Eclipse.

    Préférences -> Java -> Compilateur -> Erreurs/avertissements -> Analyse nulle

17
Jayamohan

Il existe plusieurs façons de réduire le problème de NullPointerException:

  1. Utilisez @ annulation Nullable .

  2. Testez les valeurs des arguments pour null dans les constructeurs et les setters (évitez les setters dans le vieux Java). Si vous faites cela beaucoup, vous pouvez créer un code source (Eclipse) modèle pour générer rapidement le code. Ceci est appelé "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.

  3. Assurez-vous que vous effectuez un nombre minimum (par exemple 1 ou 2) d'opérations par ligne. Si vous ne le faites pas, vous devrez découvrir où dans l'expression sur une seule ligne le NullPointerException s'est produit.

  4. N'utilisez pas null dans les champs pour indiquer l'état. Au lieu de cela, utilisez par exemple un enum State. Par exemple. ne faites pas if (socket == null) { // not connected } car il est facile d'oublier de vérifier null plus tard. Un état explicite n'est pas si facile à oublier.

  5. N'initialisez pas les variables locales sur null sauf si cela est explicitement nécessaire. En fait, si vous gérez correctement votre portée et vos exceptions, vous devriez pouvoir marquer la plupart des variables final. Le remplacement des méthodes printStacktrace() par défaut par throw new IllegalStateException("Unhandled program state", e) est utile car il est considéré comme un point de sortie d'un bloc de code.

Après beaucoup de programmation, vous constaterez que le nombre de NullPointerException diminue.

4
Maarten Bodewes