Bonne façon de gérer L'avertissement NullPointerException lint D'Android Studio
Je suis nouveau dans la programmation android/java et je ne comprends pas comment gérer correctement cet avertissement.
L'invocation de la méthode "peut produire' Java.lang.NullPointerException "
Devrais-je ussing assert pour supprimer l'avertissement?
, Ou plutôt une exception d'exécution?
Toute aide serait appréciée.
7 réponses
Je doute que cette question puisse être résolue de manière concluante, car c'est une question d'opinion. Ou du moins je le crois -- une opinion aussi. :)
Je comprends que vous voulez "0 Avertissements" (un objectif très louable) mais il n'y a probablement pas de problème "one size fits all". Qui a dit...
Choses je crois que vous devriez pas faire:
- Utiliser affirmer. Bien que vous puissiez ajouter une instruction assert, Dalvik les ignore. Vous pouvez configurer un émulateur pour les utiliser si vous le souhaitez, mais pas un appareil réel (Voir puis-je utiliser assert sur les appareils Android?). Donc, alors que cela supprimerait éventuellement l'avertissement, c'est inutile dans la pratique.
- avoir la méthode throw
NullPointerException
. Ce serait une mauvaise idée, en général. Dans ce cas, puisque vous êtes probablement remplaçantonOptionsItemSelected()
, ce n'est même pas possible.
Vérifiant (variable != null)
est généralement la meilleure approche. Que faire si elle est, cependant, présente d'autres options.
- , Si c'est un problème, vous pouvez recover from, c'est-à-dire que vous pouvez continuer l'application même si le
searchView
n'est pas là, faites-le simplement. Par exemple, il suffit de revenir de la méthode. C'est une bonne idée de journaliser cette situation, donc vous pouvez la repérer lors des tests. - Sinon, si continuer n'est pas possible, lancez une exception. Vous voulez échouer tôt , de sorte que le problème peut être facilement détecté. Une exception raisonnable pour ce cas serait IllegalStateException (voir Java équivalent à Système. net.InvalidOperationException ). Cela indique essentiellement que cette méthode a été exécutée à un moment inapproprié. Attention cependant, qu'en tant que
RuntimeException
, ces exceptions ne sont pas cochées, et donc provoqueront probablement le crash de l'application.
J'ai commencé à utiliser
@SuppressWarnings("ConstantConditions")
Sur des méthodes simples, où je suis sûr que l'id n'est pas nulle.
Personnellement, je préfère utiliser try{ }catch{ } simplement parce que c'est plus élégant. Cependant, cela ajoute beaucoup de volume à votre code, si vous imaginez mettre toutes les valeurs nulles possibles dans une capture d'essai (si elles ne sont pas l'une à côté de l'autre)
Comme @ matiash l'a souligné, il n'y a pas de solution unique.
Pour moi, un bon compromis était de désactiver l'avertissement NullPointerException
pour tous les appels à findViewById()
et de le conserver pour les autres appels de méthode. De cette façon, je prends la responsabilité de vérifier les identifiants de ressources, mais j'ai toujours l'avantage d'obtenir des avertissements si je fais d'autres erreurs.
Pour y parvenir, j'ai ajouté _ -> !null
contrat de méthode avec le menu Quick fix Android Studio.
L'action généré un fichier fichier à android/support/v7/app/annotations.xml
dans mon projet racine.
<root>
<item name='android.support.v7.app.AppCompatActivity android.view.View findViewById(int)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""_ -> !null"" />
</annotation>
</item>
</root>
Mise à Jour: Malheureusement il ne survit pas aux redémarrages D'Android Studio :-( Les annotations externes sont vraiment utiles, donc j'espère que je vais trouver un moyen de les charger Android Studio après le redémarrage.
Oui. Utiliser if (Object != null){}
pour valider est le bon moyen. try {} catch (NullPointerException) {}
est la solution suivante qui est préférée dans ce cas.
Si vous voulez en faire un tour, lancez un NullPointerException
. Lint l'ignorera dans ce cas. public void myFunc() throws NullPointerException{}
.
Quoi qu'il en soit, un bon codage signifie toujours valider tout pour un problème possible lors de l'exécution. Valider != null
est très bien et devrait toujours être utilisé chaque fois que c'est possible null.
Ce que @Herrbert74 a suggéré fonctionne sûrement bien, mais parfois il vaut mieux ne pas ajouter un @SuppressWarnings("ConstantConditions")
à une méthode entière (si ce n'est pas trivial), une meilleure approche pourrait être d'utiliser //noinspection ConstantConditions
sur la ligne avertie.
Ce sont mes règles de base:
Utiliser
@SuppressWarnings("ConstantConditions")
lorsque la méthode est simpleUtiliser
//noinspection ConstantConditions
lorsque la méthode est complexe et vous avez besoin pour supprimer l'avertissement que sur une ligne spécifique
J'aime la réponse à cette lien.
L'avertissement n'est pas une erreur. Et l'avertissement dont vous parlez dit "il peut produire", ne dites pas " il doit produire. Donc le choix est la vôtre. Ajouter une vérification null ou non
Donc, si vous êtes sûr que findViewById dans votre code ne sera jamais cause de NPE, alors n'ajoutez pas la vérification null.