Attraper des exceptions de pointeur nul
Je vous pose cette mainy sur Java, mais je suppose que c'aplies à une multitude de langues.
Envisager,
if(myVariable==null){
doSomethingAboutIt();
}
else carryOn(myVariable);
et
try{
carryOn(MyVariable);
}catch(NullPointerException e ){
doSOmethingAboutIt();}
Sont ces deux blocs de code essentiellement la même chose? Est-il une raison de choisir la deuxième approche? Bien sûr, il serait être bette rif mavariable n'a jamais été nulle, mais il semble que le meilleur moyen de vérifier c'est de faire un simple if.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
De ma position, j'hésite à tenir compte de ces deux blocs de code équivalent dans l'intention. Bien sûr, ils passent par la même erreur de manipulation, mais c'est un développeur de décision plus qu'autre chose.
Pour moi, le
if
est tests pour voir si une valeur peut être utilisée, et si il ne peut pas, c'est de travailler autour de la question. Letry...catch
bloc est en supposant la valeur est valide, et si elle n'est pas le cas, il tombe à travers pour contourner le comportement aberrant.Exceptions doivent surtout être considéré lors de l'aberrante, programme de casser le code produit (division par zéro, etc.).
Vous utilisez uniquement des exceptions pour des événements exceptionnels. Aller avec le premier bloc de code, pas le second.
Non, ces blocs de code ne sont pas du tout la même chose.
Dans le premier bloc de code, vous vérifiez si
myVariable
estnull
et vous le faites à un seul point dans le temps. Plus tard,myVariable
peut devenirnull
et éventuellement jeter unNullPointerException
. Si cela se produit, le deuxième extrait de code de capture de l'exception, mais la première ne sera pas.En outre, le deuxième extrait de code catch
NullPointerExceptions
qui peut être levée à partir de n'importe où dans la pile d'appel résultant de lacarryOn(myVariable)
appel. C'est terrible; vous êtes à avaler une exception d'exploitation dans l'hypothèse d'une variable donnée estnull
quand il peut être quelque chose d'autre entièrement.Utiliser le premier extrait de code.
Bien, par lui-même,
carryOn(MyVariable);
ne jamais jeter un NPE, à moins que quelque chose d'autre au sein decarryOn
fait référence à un appel de méthode ou propriété sur une instance null.D'intercepter les exceptions est plus gourmand en ressources que de vérifier d'abord pour elle, que la génération d'une exception exige une trace de la pile, etc.
Je dirais qu'il en résulte "nettoyeur" de code.
Voir aussi:
- Java try/catch de la performance, il est recommandé de conserver ce qui est à l'intérieur de l'essayer clause à un minimum?
- Essayez D'Attraper Les Performances De Java
La première approche est mieux que d'attraper une exception parce qu'il y a de la performance peine encourue. La meilleure approche, à mon avis, est d'appliquer Objet Null modèle. Goyave bibliothèque fournit En option classe pour que vous puissiez exploiter au lieu de créer votre propre.