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’
Devrais-je utiliser assert pour supprimer l’avertissement?
Ou plutôt une exception d’exécution?
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:
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.
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. 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 simpleUtilisez
//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.