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 "

entrez la description de l'image ici

Devrais-je ussing assert pour supprimer l'avertissement? entrez la description de l'image ici

, Ou plutôt une exception d'exécution? entrez la description de l'image ici

Toute aide serait appréciée.

31
demandé sur Hackmodford 2014-04-29 21:57:40

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çant onOptionsItemSelected(), 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.
25
répondu matiash 2017-05-23 12:10:50

J'ai commencé à utiliser

@SuppressWarnings("ConstantConditions")

Sur des méthodes simples, où je suis sûr que l'id n'est pas nulle.

22
répondu Herrbert74 2016-06-08 15:52:34

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)

1
répondu Georgi Angelov 2014-06-19 13:13:55

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="&quot;_ -&gt; !null&quot;" />
    </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.

1
répondu Iwo Banas 2016-07-12 09:55:19

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.

1
répondu Emanuel S 2016-11-11 19:44:43

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 simple

  • Utiliser //noinspection ConstantConditions lorsque la méthode est complexe et vous avez besoin pour supprimer l'avertissement que sur une ligne spécifique

1
répondu MatPag 2017-12-13 01:01:42

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.

0
répondu Ryan 2017-05-23 10:29:58