Manière appropriée de gérer l’avertissement de peluches NullPointerException d’Android Studio

Je suis nouveau sur la programmation Android / Java et je suis confus comment gérer correctement cet avertissement.

Invocation de la méthode ” peut produire ‘Java.lang.NullPointerException’

entrer la description de l'image ici

Devrais-je utiliser assert pour supprimer l’avertissement? entrer la description de l'image ici

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

Toute aide serait appréciée.

Je doute que cette question puisse être résolue, car c’est une question d’opinion. Ou du moins je le crois – une opinion aussi. 🙂

Je comprends que vous voulez “0 avertissements” (un objective très louable) mais il n’y a probablement pas de problème “taille unique”. Cela dit…

Les choses que je crois que vous ne devriez pas faire:

  • Utilisez assert . Alors que vous pouvez append une déclaration d’affirmation, Dalvik les ignore. Vous pouvez configurer un émulateur pour les utiliser si vous le souhaitez, mais pas un périphérique réel (voir Puis-je utiliser assert sur les appareils Android? ). Donc, même s’il est possible que cet avertissement disparaisse, il est inutile dans la pratique.
  • Demandez à la méthode de lancer NullPointerException . Ce serait une mauvaise idée, en général. Dans ce cas, comme vous onOptionsItemSelected() probablement onOptionsItemSelected() , ce n’est même pas possible.

Vérifier (variable != null) est généralement la meilleure approche. Quoi faire, cependant, présente d’autres options.

  • Si c’est un problème que vous pouvez récupérer , c’est-à-dire que vous pouvez continuer l’application même si searchView n’est pas là, faites-le simplement. Par exemple, il suffit de revenir de la méthode. Il est toutefois judicieux de consigner cette situation afin de pouvoir la repérer pendant les tests.
  • Sinon, si continuer n’est pas possible, lève une exception. Vous souhaitez échouer rapidement afin que le problème soit facilement détecté. Une exception raisonnable pour ce cas serait IllegalStateException (voir Java équivalent à .NET System.InvalidOperationException ). Cela indique en gros que cette méthode a été exécutée à un moment inapproprié. Attention cependant, en tant RuntimeException , ces exceptions ne sont pas contrôlées et causeront probablement un blocage de l’application.

J’ai commencé à utiliser

@SuppressWarnings("ConstantConditions")

sur des méthodes simples où je suis sûr que l’identifiant n’est pas nul.

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 NULL possibles dans un catch try (si elles ne sont pas côte à côte)

Comme @matiash l’a fait remarquer, il n’y a pas de solution unique.

Pour moi, un bon compromis consistait à désactiver l’avertissement NullPointerException pour tous les appels à findViewById() et à le conserver pour les autres appels de méthode. De cette façon, je prends la responsabilité de vérifier les identifiants de ressource, tout en bénéficiant d’avertissements si je commets d’autres erreurs.

Pour ce faire, j’ai ajouté un contrat avec la méthode _ -> !null avec le menu de réparation rapide d’Android Studio.

L’action a généré un fichier suivant sur android/support/v7/app/annotations.xml dans la racine de mon projet.

        

Mise à jour: Malheureusement, il ne survit pas aux redémarrages d’Android Studio 🙁 Les ​​annotations externes sont vraiment utiles, alors j’espère trouver un moyen de faire en sorte qu’Android Studio les charge après le redémarrage.

Oui. Utiliser if (Object != null){} pour valider est le moyen approprié. try {} catch (NullPointerException) {} est la solution suivante qui est préférée dans ce cas.

Si vous voulez vous en sortir, lancez une NullPointerException . Lint l’ignorera dans ce cas. public void myFunc() throws NullPointerException{} .

Quoi qu’il en soit, un bon codage signifie toujours de tout valider pour un éventuel problème pendant l’exécution. Valider != null est très bien et devrait toujours être utilisé chaque fois que possible.

Ce que @ Herrbert74 a suggéré, cela fonctionne sûrement bien, mais parfois, il vaut mieux ne pas append un @SuppressWarnings("ConstantConditions") à une méthode complète (si ce n’est pas sortingvial), une meilleure approche pourrait être d’utiliser //noinspection ConstantConditions sur la ligne avertie .

Ce sont mes règles de base:

  • Utilisez @SuppressWarnings("ConstantConditions") lorsque la méthode est simple

  • Utilisez //noinspection ConstantConditions lorsque la méthode est complexe et que vous ne devez supprimer l’avertissement que sur une ligne spécifique

J’aime la réponse à ce lien .

Avertissement n’est pas une erreur. Et l’avertissement dont vous parlez dit “ça peut produire”, ne dites pas “ça doit produire”. Alors, le choix est à vous. Soit append un chèque nul ou non

Donc, si vous êtes sûr que findViewById dans votre code ne sera jamais la cause de NPE, alors n’ajoutez pas la vérification null.