Quelle est la liste des noms d'avertissement @SuppressWarnings valides en Java?

265

Quelle est la liste des @SuppressWarningsnoms d'avertissement valides en Java?

Le bit qui vient entre le ("")dans @SuppressWarnings("").

Ron Tuffin
la source
3
Cette question est vraiment sympa et les réponses sont utiles. Si quelqu'un du JCP le regarde, vous devez vous rendre compte à quel point il est compliqué d'ajouter un avertissement de suppression. Il n'y a pas de convention sur le cas, le trait d'union, le cas de chameau, c'est juste un gâchis, ce serait bien de standardiser cela.
Snicolas
Je vois "ProhibitedExceptionDeclared"dans Eclipse Collections Framework ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction), et ce n'est pas répertorié ci-dessous.
kevinarpe

Réponses:

251

Cela dépend de votre IDE ou de votre compilateur.

Voici une liste pour Eclipse Galileo:

  • tout pour supprimer tous les avertissements
  • boxe pour supprimer les avertissements relatifs aux opérations de boxe / déballage
  • cast pour supprimer les avertissements relatifs aux opérations de cast
  • dep-ann pour supprimer les avertissements relatifs aux annotations obsolètes
  • dépréciation pour supprimer les avertissements relatifs à la dépréciation
  • solution pour supprimer les avertissements relatifs aux ruptures manquantes dans les instructions switch
  • enfin pour supprimer les avertissements relatifs au bloc finalement qui ne reviennent pas
  • masquage pour supprimer les avertissements relatifs aux sections locales qui masquent une variable
  • commutateur-incomplet pour supprimer les avertissements relatifs aux entrées manquantes dans une instruction switch (cas enum)
  • nls pour supprimer les avertissements relatifs aux littéraux de chaîne non nls
  • null pour supprimer les avertissements relatifs à l'analyse nulle
  • restriction pour supprimer les avertissements relatifs à l'utilisation de références découragées ou interdites
  • série pour supprimer les avertissements relatifs au champ serialVersionUID manquant pour une classe sérialisable
  • accès statique pour supprimer les avertissements relatifs à un accès statique incorrect
  • accès synthétique pour supprimer les avertissements relatifs à l'accès non optimisé des classes internes
  • non cochée pour supprimer les avertissements relatifs aux opérations non cochées
  • unqualified-field-access pour supprimer les avertissements relatifs à l'accès au champ non qualifié
  • inutilisé pour supprimer les avertissements relatifs au code inutilisé

Liste pour Indigo ajoute:

  • javadoc pour supprimer les avertissements par rapport aux avertissements javadoc
  • rawtypes pour supprimer les avertissements relatifs à l'utilisation des types bruts
  • méthode statique pour supprimer les avertissements relatifs aux méthodes pouvant être déclarées comme statiques
  • super pour supprimer les avertissements relatifs au remplacement d'une méthode sans super invocations

La liste de Juno ajoute:

  • ressource pour supprimer les avertissements relatifs à l'utilisation des ressources de type Closeable
  • sync-override pour supprimer les avertissements en raison d'une synchronisation manquante lors de la substitution d'une méthode synchronisée

Kepler et Luna utilisent la même liste de jetons que Juno ( liste ).

D'autres seront similaires mais varient.

cletus
la source
Dans quels cas la suppression d'un avertissement nul serait-elle utile?
Jesse Jashinsky
@Jesse: Lorsque le compilateur est erroné (c'est-à-dire un "avertissement" Stupid Flanders "). Essayez de compiler: void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }. Certains environnements (par exemple NetBeans 7.3 avec JDK Java 6 [1.6.0_41]) seront générés "o possibly null"à l' o.toString()appel même s'ils one peuvent pas être nuls à ce stade.
par
2
@cletus: Est-il possible d'ajouter des types d'avertissements dans eclipse? Le problème est que l'un des membres de notre équipe utilise IntelliJ et que l'EDI a d'autres types d'avertissement de suppression qui donnent des avertissements dans Eclipse :) Dans Eclipse Indigo, vous pouvez définir les préférences: Ignorer les jetons SuppressWarnings inutilisés, mais cela ne semble pas fonctionner ...
KC
semicolonne semble pas fonctionner dans luna? :( Quelqu'un peut-il vérifier si elle semicolonest bien valide?
Kissaki
Quelle est la valeur pour supprimer l'avertissement "synchronisation sur le champ non final"?
matteo
48

Toutes les valeurs sont autorisées (les valeurs non reconnues sont ignorées). La liste des fichiers reconnus est spécifique au compilateur.

Dans les didacticiels Java unchecked et deprecationsont répertoriés comme les deux avertissements requis par la spécification du langage Java, ils doivent donc être valides avec tous les compilateurs:

Chaque avertissement du compilateur appartient à une catégorie. La spécification du langage Java répertorie deux catégories: obsolète et non cochée.

Les sections spécifiques de la spécification du langage Java où elles sont définies ne sont pas cohérentes d'une version à l'autre. Dans la spécification Java SE 8 uncheckedet deprecationsont répertoriés comme avertissements du compilateur dans les sections 9.6.4.5. @SuppressWarnings et 9.6.4.6 @Deprecated , respectivement.

Pour le compilateur de Sun, l'exécution javac -Xdonne une liste de toutes les valeurs reconnues par cette version. Pour 1.5.0_17, la liste semble être:

  • tout
  • désapprobation
  • décoché
  • tomber dans
  • chemin
  • en série
  • enfin
Martin McNulty
la source
43

La liste est spécifique au compilateur. Mais voici les valeurs prises en charge dans Eclipse :

  • allDeprecation deprecation même à l'intérieur du code obsolète
  • allJavadoc javadoc invalide ou manquant
  • assertIdentifier occurrence d'assert utilisé comme identifiant
  • conversion boxing autoboxing
  • charConcat lorsqu'un tableau char est utilisé dans une concaténation de chaîne sans être converti explicitement en chaîne
  • conditionAssign possible booléen accidentel
  • méthode constructorName avec le nom du constructeur
  • dep-ann manquante @ Annotation obsolète
  • deprecation utilisation de types obsolète ou élément de code obsolète extérieur
  • utilisation découragée des types correspondant à une règle d'accès découragée
  • emptyBlock bloc vide non documenté
  • enumSwitch , interrupteur incomplet interrupteur énumération incomplète
  • cas de chute possible
  • fieldHiding field cachant une autre variable
  • Paramètre de type finalBound avec borne finale
  • enfin finalement bloquer ne se termine pas normalement
  • utilisation interdite de types correspondant à une règle d'accès interdit
  • masquage de macro pour fieldHiding, localHiding, typeHiding et maskedCatchBlock
  • indirectStatic référence indirecte à un membre statique
  • type d'annotation intfAnnotation utilisé comme super interface
  • intfNonInherited, interface, méthode non héritée, compatibilité
  • javadoc javadoc invalide
  • localHiding variable locale cachant une autre variable
  • maskedCatchBlocks bloc de capture caché
  • nls non-nls littéraux de chaîne (sans balises // $ NON-NLS-)
  • Affectation noEffectAssign sans effet
  • null potentiel chèque nul manquant ou redondant
  • nullDereference manque la vérification nulle
  • over-ann manquante annotation @Override
  • paramAssigner l' affectation à un paramètre
  • pkgDefaultMethod tente de remplacer la méthode par défaut du package
  • première utilisation a de type brut ( au lieu d'un type paramétré)
  • point- virgule point-virgule inutile ou instruction vide
  • série manquante serialVersionUID
  • Constructeur ou paramètre setParamHiding masquant un autre champ
  • macro d' accès statique pour indirectStatic et staticReceiver
  • staticReceiver si un récepteur non statique est utilisé pour obtenir un champ statique ou appeler une méthode statique
  • super redéfinir une méthode sans faire une super invocation
  • supprimer activer @SuppressWarnings
  • synthétiqueAccess, accès synthétique lors de l'accès synthétique pour la classe interne
  • les tâches permettent la prise en charge des balises de tâches dans le code source
  • typeHiding, paramètre de type masquant un autre type
  • opération de type non cochée non cochée
  • clause Else inutile inutile
  • unqualified-field-access, unqualifiedField référence non qualifiée au champ
  • macro inutilisée pour non utiliséArgument, non utiliséImport, non utiliséLabel, non utiliséLocal, non utiliséPrivé et non utiliséThrown
  • UsedArgument , argument de méthode inutilisé
  • non utiliséImporter la référence d'importation non utilisée
  • étiquette non utilisée étiquette non utilisée
  • unusedLocal variable locale inutilisée
  • Déclaration de membre privé inutilisé privé
  • usedThrown exception déclarée levée non utilisée
  • uselessTypeVérifiez la conversion / instance inutile de l'opération
  • varargsCast L'argument varargs nécessite une conversion explicite
  • warningToken jeton d'avertissement non géré dans @SuppressWarnings

Sun JDK (1.6) a une liste plus courte des avertissements pris en charge:

  • dépréciation Vérifier l'utilisation des éléments amortis.
  • unchecked Donnez plus de détails pour les avertissements de conversion non vérifiés qui sont obligatoires par la spécification du langage Java.
  • serial Avertir des définitions serialVersionUID manquantes sur les classes sérialisables.
  • enfin Avertit des clauses finalement qui ne peuvent pas se terminer normalement.
  • fallthrough Vérifiez les blocs d'interrupteurs pour les cas de chute et fournissez un message d'avertissement pour tous ceux qui sont trouvés.
  • path Recherchez un chemin inexistant dans les chemins d'environnement (comme classpath).

Les derniers javac disponibles (1.6.0_13) pour mac ont les avertissements pris en charge suivants

  • tout
  • jeter
  • désapprobation
  • divzero
  • vide
  • décoché
  • tomber dans
  • chemin
  • en série
  • enfin
  • remplace
D. Wroblewski
la source
La liste Eclipse ici regarde les drapeaux du compilateur et non les annotations SuppressWarning (vérifiez la dernière partie du document que vous avez lié).
Ron Tuffin
3
Ce sont les deux. En définissant les drapeaux du compilateur, vous indiquez au compilateur le type d'avertissements que vous souhaitez. Avec les annotations, vous pouvez supprimer ces avertissements à des endroits spécifiques de votre code.
D.Wroblewski
Je pense que la liste est plus courte pour Eclipse. Voir les derniers documents galileo, la liste des jetons disponibles pour SupressWarnings y est explicite: help.eclipse.org/galileo/index.jsp?topic=/…
Peter Štibraný
2
J'ai essayé @SuppressWarnings ("raw") dans Eclipse 3.5 et cela ne fonctionne pas - je reçois un avertissement indiquant que "raw" n'est pas une valeur valide pour cette annotation.
Jesper
moi aussi. Malheureusement, le support jsp n'est pas aussi purifié que le support java.
STU
9

Un nouveau favori pour moi est @SuppressWarnings("WeakerAccess")dans IntelliJ, ce qui l'empêche de se plaindre quand il pense que vous devriez avoir un modificateur d'accès plus faible que celui que vous utilisez. Nous devons avoir un accès public à certaines méthodes pour prendre en charge les tests, et l' @VisibleForTestingannotation n'empêche pas les avertissements.

ETA: "Anonymous" a commenté, sur la page @MattCampbell liée à, la note incroyablement utile suivante:

Vous ne devriez pas avoir besoin d'utiliser cette liste aux fins que vous décrivez. IntelliJ ajoutera automatiquement ces SuppressWarnings si vous le lui demandez. Il a été capable de le faire pour autant de versions que je me souviens.

Rendez-vous simplement à l'endroit où vous avez l'avertissement et tapez Alt-Entrée (ou sélectionnez-le dans la liste Inspections si vous l'y voyez). Lorsque le menu apparaît, affichant l'avertissement et proposant de le corriger pour vous (par exemple, si l'avertissement est "La méthode peut être statique", alors "rendre statique" est l'offre d'IntellJ de le corriger pour vous), au lieu de sélectionner "entrer", utilisez simplement le bouton fléché vers la droite pour accéder au sous-menu, qui aura des options comme "Modifier le paramètre de profil d'inspection" et ainsi de suite. Au bas de cette liste se trouvent des options telles que "Supprimer toutes les inspections pour la classe", "Supprimer pour la classe", "Supprimer pour la méthode" et occasionnellement "Supprimer pour l'instruction". Vous voulez probablement celui qui apparaît en dernier sur la liste. La sélection de l'un d'eux ajoutera une annotation @SuppressWarnings (ou un commentaire dans certains cas) à votre code supprimant l'avertissement en question. Vous n'aurez pas besoin de deviner quelle annotation ajouter, car IntelliJ choisira en fonction de l'avertissement que vous avez sélectionné.

barclay
la source
2

J'ai remarqué que cela //noinspectionpeut être généré automatiquement dans IntelliJ

  • assurez-vous que vous n'avez pas déjà un plan @SuppressWarninigsavant la déclaration
  • Vous pouvez maintenant générer automatiquement le spécifique //noinspectionen appuyant sur Alt + Entrée lorsque l'avertissement est sélectionné, puis utilisez la touche fléchée droite pour voir l' option Supprimer pour ...

Je me suis retrouvé ici quand j'ai voulu supprimer un avertissement «Le commutateur a trop peu d'étiquettes de cas» d'IntelliJ. Je n'ai pas trouvé de liste complète pour le @SuppressWarningsupport d'IntelliJ mais //noinspectionj'ai fait l'affaire pour moi.

hb0
la source
Vous pouvez également ajouter @SuppressWarnings ("SwitchStatementWithTooFewBranches") pour cela.
JPM
Malheureusement, l' option Supprimer pour ... lorsque vous cliquez sur ALT + ENTRÉE n'est pas toujours disponible
flawyte
//noinspection SwitchStatementWithTooFewBranchesavant les switchtravaux aussi pour moi.
Oliver Hausler
1

Et cela semble être une liste beaucoup plus complète, où j'ai trouvé des avertissements spécifiques à Android-Studio que je ne pouvais pas trouver ailleurs (par exemple SynchronizeOnNonFinalField)

https://jazzy.id.au/2008/10/30/list_of_suppresswarnings_arguments.html

Oh, maintenant les directives de SO contredisent les restrictions de SO. D'une part, je suis censé copier la liste plutôt que de ne fournir que le lien. Mais d'un autre côté, cela dépasserait le nombre maximum autorisé de caractères. Espérons donc que le lien ne se cassera pas.

matteo
la source
1

JSL 1.7

La documentation Oracle mentionne:

  • unchecked: Les avertissements non vérifiés sont identifiés par la chaîne "non vérifiée".
  • deprecation: Un compilateur Java doit générer un avertissement de dépréciation lorsqu'un type, une méthode, un champ ou un constructeur dont la déclaration est annotée avec l'annotation @Deprecated est utilisé (c'est-à-dire remplacé, invoqué ou référencé par son nom), sauf si: [...] l'utilisation est au sein d'une entité qui est annotée pour supprimer l'avertissement avec l'annotation @SuppressWarnings ("obsolète"); ou

Il explique ensuite que les implémentations peuvent ajouter et documenter les leurs:

Les fournisseurs de compilateurs doivent documenter les noms d'avertissement qu'ils prennent en charge conjointement avec ce type d'annotation. Les fournisseurs sont encouragés à coopérer pour garantir que les mêmes noms fonctionnent sur plusieurs compilateurs.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
1
Ce n'est pas vrai que uncheckedc'est le seul approuvé par la norme; la section très suivante de celle que vous avez citée indique que les avertissements de dépréciation ne devraient pas être produits lorsque "L'utilisation est dans une entité qui est annotée pour supprimer l'avertissement avec l'annotation @SuppressWarnings("deprecation")"
kbolino
1

Je veux juste ajouter qu'il existe une liste principale de paramètres de suppression IntelliJ sur: https://gist.github.com/vegaasen/157fbc6dce8545b7f12c

Il semble assez complet. Partiel:

Warning Description - Warning Name

"Magic character" MagicCharacter 
"Magic number" MagicNumber 
'Comparator.compare()' method does not use parameter ComparatorMethodParameterNotUsed 
'Connection.prepare*()' call with non-constant string JDBCPrepareStatementWithNonConstantString 
'Iterator.hasNext()' which calls 'next()' IteratorHasNextCallsIteratorNext 
'Iterator.next()' which can't throw 'NoSuchElementException' IteratorNextCanNotThrowNoSuchElementException 
'Statement.execute()' call with non-constant string JDBCExecuteWithNonConstantString 
'String.equals("")' StringEqualsEmptyString 
'StringBuffer' may be 'StringBuilder' (JDK 5.0 only) StringBufferMayBeStringBuilder 
'StringBuffer.toString()' in concatenation StringBufferToStringInConcatenation 
'assert' statement AssertStatement 
'assertEquals()' between objects of inconvertible types AssertEqualsBetweenInconvertibleTypes 
'await()' not in loop AwaitNotInLoop 
'await()' without corresponding 'signal()' AwaitWithoutCorrespondingSignal 
'break' statement BreakStatement 
'break' statement with label BreakStatementWithLabel 
'catch' generic class CatchGenericClass 
'clone()' does not call 'super.clone()' CloneDoesntCallSuperClone
Matt Campbell
la source
1

Si vous utilisez SonarLint, essayez au-dessus de la méthode ou classe toute la chaîne de squid: @SuppressWarnings ("squid: S1172")

R Strauss
la source