Est Attraper une Exception de Pointeur Null une Odeur de Code?
Récemment, un co-travailleur de la mine a écrit dans un peu de code pour attraper une exception de pointeur null autour d'un ensemble de méthode, et de retourner un résultat unique. Je l'ai souligné comment il pourrait y avons été un certain nombre de raisons pour le pointeur null, alors nous l'avons changé pour une défensive vérifier le résultat.
Cependant, la capture de NullPointerException semblait mal pour moi. Dans mon esprit, pointeur Null exceptions sont le résultat d'un mauvais code et de ne pas être une exception prévue dans le système.
Existe-il des cas où il fait sens pour attraper une exception de pointeur null?
Vous devez vous connecter pour publier un commentaire.
Oui, attraper des
RuntimeException
est presque toujours une odeur de code. Le C2 Wiki semble d'accord.Une exception serait probablement certains spécialement défensive des morceaux de code qui fonctionnent assez bien code aléatoire à partir des autres modules. Des exemples de telles structures défensives serait le HAE, ThreadPools/Exécuteurs testamentaires et système de plugin.
Exception
ou peut-être mêmeThrowable
au lieu de précisémentRuntimeException
.RuntimeException
), dont beaucoup sont emminently catchable (par exemple, nouvelle tentative d'accès aux données). Juste parce que vous n'avez pas pour pour l'attraper, ne signifie pas que vous ne pas de l'attraper.Je pense exactement une utilisation pour jamais attraper un
NullPointerException
:J'ai dû attraper nullpointer exception parfois, en raison d'un bogue dans la troisième partie de la bibliothèque. La bibliothèque nous avons utilisé des lance cette exception, et c'était rien que nous pourrions faire à ce sujet.
Dans ce cas, il est OK de l'attraper, pas autrement.
Il dépend.
La façon connu ce collègue? Est-il de le faire pour de l'ignorance/la paresse ou est-il une vraie bonne raison pour cela? ( comme c'est le thread principal au-dessus de tout le reste et ne devrait jamais mourir? )
90% du temps d'attraper une exception d'exécution est faux, 99% de la capture d'une NullPointerException est faux ( si la raison en est "je recevais beaucoup d'entre eux...", puis l'ensemble de programmeur est faux et vous devriez regarder prendre soin pour le reste du code, il a à faire )
Mais dans certaines circonstances, d'attraper un NullPointerException peut être acceptable.
En général, je pense que c'est une odeur de code; il me semble que la défensive des contrôles sont mieux. Je confiais que pour couvrir la plupart des décoché exceptions, sauf dans le cas des boucles, etc. que voulez attraper toutes les erreurs de déclaration/enregistrement.
L'exception je pense, serait d'environ un appel à une bibliothèque qui ne peut pas être modifié et ce qui peut générer une exception de pointeur null en réponse à certaines échec d'assertion qui est difficile à vérifier de façon proactive.
Drôle
Je viens de trouver quelque chose qui ne devrait pas être fait au travail:
baaad 🙂
Le développeur a voulu le calendrier de lever des exceptions de ce genre:
d'invalider les valeurs...
Oui, il fonctionne, mais ce n'est pas vraiment une bonne pratique...
Levée de l'exception (en particulier le remplissage de la trace de la pile) coût beaucoup plus que la simple vérification des données manuellement sans exception...
Il est mauvais, mais qu'il peut produire des optimisé bytecode.
Si le nombre Entier
i
n'est pasnull
la plupart du temps, puis vérifier diminue la performance globale. La vérification elle-même coûte 3 instructions (0-4). Toute l'affaire prend alors 7 instructions (de 0 à 14 ans).Suivantes L'aeap approche qui est commun en Python monde. Le
null
cas sera coûteux, mais nous avons besoin de seulement 4 instructions (0-7) pournot null
cas.Qui sait, si le compilateur JIT pouvez optimiser cette?
Il est certainement.
La plupart du temps, les variables ne devrait pas être null pour commencer. Beaucoup de nouvelles langues sont à venir avec la prise en charge intégrée pour les non nullable types de référence, -- c'est les types qui sont la garantie de ne jamais être null.
Pour les moments où votre valeur entrante est autorisé à être null, vous devez faire un chèque. Mais des exceptions sont définitivement une mauvaise façon de le faire.
Une instruction if faut peut-être trois instructions à exécuter et est une vérification locale (c'est à dire, faire le chèque au même endroit que vous avez besoin de la garantie).
L'aide d'une exception, d'autre part, peut prendre beaucoup plus d'instructions -- le système tente de chercher la méthode, ne parvient pas, regarde à travers la table d'exception pour le gestionnaire d'exception, sauts il y, exécute le gestionnaire, et les sauts de nouveau. En outre, la vérification est potentiellement non-local. Si votre code est quelque chose comme ceci:
Vous ne savez pas si le NPE a été jeté dans 'getEmail" ou dans "rechercher".
Une technique pire solution à un très, très commun que les écrits en plus obscurci façon? Il n'est pas de rang, mais ça sent mauvais :/
Le seul endroit où vous devez attraper un NullPointerException (ou plus précisément, juste une Throwable) à un niveau supérieur ou à la limite du système, de sorte que votre programme n'a pas complètement crash et peut récupérer. Par exemple, la création d'une page d'erreur dans votre web.xml fournit un fourre-tout, de sorte qu'une application web peut récupérer à partir d'une exception et d'en informer les utilisateurs.
Attraper une exception de pointeur NULL dépend vraiment du contexte ... on devrait s'efforcer d'éviter les strictes règles absolues ... règles doivent être appliquées dans le contexte voulez piège de cette exception et mettre l'ensemble du logiciel dans certains état STABLE, de ne rien faire ou presque à côté de rien. Toutes ces règles de codage doivent être bien compris
À ce stade, vous regardez alors votre logiciel de TRACE d'AUDIT ... que vous devriez faire et à découvrir la SOURCE de cette exception.
L'idée qu'une Exception de Pointeur NULL Ne sera Jamais Survenir doivent être vérifiables. D'abord faire une analyse statique ... (ce qui est plus difficile si la 3ème partie du code/composants venir) et ensuite faire une liste exhaustive de l'état de l'espace de recherche en utilisant les outils appropriés.
x
Attraper des Npe (tout RTEs, en fait), peut être nécessaire à proprement mettre fin à un Swing-application graphique.
edit : dans ce cas, il est fait généralement via un UncaughtExceptionHandler bien.
Quoi à ce sujet:
comme un micro-optimisation de foo peut être nulle, mais presque jamais?
L'idée est la suivante:
Une valeur NULL explicite de vérifier, à partir d'une instruction machine
D'autre part, la valeur NULL est à vérifier dans la deuxième version peut être fait en laissant le NUL accès, la capture de la SIGSEGV, et en jetant un NullPointerException. C'est gratuit si l'objet n'est pas NULL.
Il y a longtemps j'ai eu un utiliser. Particulièrement stupide de la bibliothèque de jeter des NullPointerException lors de la demande d'un objet dans une collection par clé et l'objet n'a pas été trouvé. Il n'y a pas d'autre façon de chercher que par clé et aucun moyen de vérifier si l'objet existe.
Quelques temps plus tard, nous avons démarré le vendeur et a commencé à la modification de la bibliothèque. Maintenant, la bibliothèque jette une meilleure exception (de mon changement) et a une fonction de contrôle (de quelqu'un d'autre changement).
Bien sûr, j'ai toujours exactement une ligne à l'intérieur du bloc try. De plus et je me serais coupable de mauvais code.
J'essaie de garantir les résultats de mes interfaces, mais si une bibliothèque ou quelqu'code peut produire de la valeur null comme un résultat et im attend à une garantie de la capture, il pourrait être viable. Bien sûr, ce que vous faites une fois que vous attraper, il est à vous. Parfois il ne fait pas de sens pour vérifier la valeur null, et si vous l'attrapez vous avez une autre méthode de résolution de problème qui pourrait ne pas être aussi bonne, mais fait le travail.
Ce que je dis est l'utilisation d'exceptions pour ce que vous pouvez, c'est une assez bonne fonctionnalité du langage.
Attraper un NullPointerException peut être utile si votre appels de méthode d'une interface externe (ou une API SOAP) et il ya une possibilité que la valeur retournée peut être Null. Autre que cela, il n'y a pas un énorme avantage pour la capture de ces exceptions.
Cela dépend vraiment de la définition de l'interface. Non structurées NPE la manipulation est aussi mauvais que la capture d'Exception ou de Throwable.
Les valeurs null sont utiles pour l'identification d'un état non initialisé plutôt que d'utiliser une chaîne vide ou max_int ou quoi que ce soit. Une fois à l'endroit où je utiliser la valeur null est régulièrement dans les endroits où un objet de rappel n'est pas pertinent.
J'aime vraiment le @Nullable annotations fournies par Guice.
http://code.google.com/docreader/#p=google-guice&s=google guice&t=UseNullable
Oui en Java, il est nécessaire de vérifier pour un NullPointerException.
Renvoyée lorsqu'une application tente d'utiliser la valeur null dans le cas où un objet est requis. Elles comprennent:
L'appel de la méthode d'instance d'un objet null.
L'accès ou de modification du champ d'un objet null.
En prenant la longueur de la valeur null comme si c'était un tableau.
D'accéder ou de modifier les fentes de la valeur null comme si c'était un tableau.
Jeter null comme si c'était un Throwable valeur.
Applications devraient jeter les instances de cette classe pour indiquer que d'autres l'usage illicite de l'objet nul.
NullPointerException dans d'autres langues lors de la lecture des fichiers texte (c'est à dire XML), dont les dossiers n'ont pas été validées pour le bon caractère ASCII et le format d'enregistrement.
Si le programmeur est un débutant, il peut avoir l'habitude d'attraper tous les exception qui s'arrête de lui pour obtenir le résultat final. Cela ne devrait pas être diverti par le code des réviseurs.
Attraper des RuntimeException est mauvais. Mais si cela est vraiment nécessaire, puis un commentaire dans le code sera vraiment utile pour les futurs programmeurs qui travaillent sur le code. Si vous ne pouvez pas écrire un raisonnable commentaire pour les attraper, alors vous devez éviter. période.