Was ist die Liste der gültigen @ SuppressWarnings-Warnnamen in Java?

264

Was ist die Liste der gültigen @SuppressWarningsWarnnamen in Java?

Das Bit, das zwischen dem ("")In kommt @SuppressWarnings("").

Ron Tuffin
quelle
3
Diese Frage ist wirklich nett und Antworten sind nützlich. Wenn jemand vom JCP darauf schaut, sollten Sie erkennen, wie unordentlich es ist, eine Unterdrückungswarnung hinzuzufügen. Es gibt keine Konvention für Fall, Bindestrich, Kamelfall, es ist nur ein einfaches Durcheinander, es wäre schön, dies zu standardisieren.
Snicolas
Ich sehe "ProhibitedExceptionDeclared"in Eclipse Collections Framework ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction), und das ist unten nicht aufgeführt.
Kevinarpe

Antworten:

250

Dies hängt von Ihrer IDE oder Ihrem Compiler ab.

Hier ist eine Liste für Eclipse Galileo:

  • alle , um alle Warnungen zu unterdrücken
  • Boxen , um Warnungen in Bezug auf Box- / Unboxing-Vorgänge zu unterdrücken
  • cast , um Warnungen in Bezug auf Cast-Operationen zu unterdrücken
  • dep-ann , um Warnungen in Bezug auf veraltete Anmerkungen zu unterdrücken
  • Verfall , um Warnungen in Bezug auf Verfall zu unterdrücken
  • Fallthrough , um Warnungen in Bezug auf fehlende Unterbrechungen in switch-Anweisungen zu unterdrücken
  • Endlich , um Warnungen bezüglich des endgültigen Blockierens zu unterdrücken, die nicht zurückkehren
  • Ausblenden , um Warnungen in Bezug auf Einheimische zu unterdrücken, die Variablen ausblenden
  • unvollständiger Schalter zur Unterdrückung von Warnungen in Bezug auf fehlende Einträge in einer switch-Anweisung (enum case)
  • nls zum Unterdrücken von Warnungen in Bezug auf Nicht-nls-String-Literale
  • null , um Warnungen in Bezug auf die Nullanalyse zu unterdrücken
  • Einschränkung zur Unterdrückung von Warnungen in Bezug auf die Verwendung entmutigter oder verbotener Verweise
  • serial , um Warnungen in Bezug auf das fehlende Feld serialVersionUID für eine serialisierbare Klasse zu unterdrücken
  • statischer Zugriff zum Unterdrücken von Warnungen in Bezug auf falschen statischen Zugriff
  • Synthetischer Zugriff zur Unterdrückung von Warnungen in Bezug auf nicht optimierten Zugriff von inneren Klassen
  • deaktiviert , um Warnungen in Bezug auf nicht aktivierte Vorgänge zu unterdrücken
  • unqualifizierter Feldzugriff zur Unterdrückung von Warnungen in Bezug auf unqualifizierten Feldzugriff
  • nicht verwendet , um Warnungen in Bezug auf nicht verwendeten Code zu unterdrücken

Liste für Indigo fügt hinzu:

  • Javadoc , um Warnungen in Bezug auf Javadoc-Warnungen zu unterdrücken
  • rawtypes zu Unterdrückungs - Warnungen in Bezug auf die Verwendung von rohen Typen
  • statische Methode zum Unterdrücken von Warnungen in Bezug auf Methoden, die als statisch deklariert werden könnten
  • super , um Warnungen bezüglich des Überschreibens einer Methode ohne Superaufrufe zu unterdrücken

Liste für Juno fügt hinzu:

  • Ressource zum Unterdrücken von Warnungen in Bezug auf die Verwendung von Ressourcen vom Typ Closeable
  • Sync-Override zum Unterdrücken von Warnungen aufgrund fehlender Synchronisierung beim Überschreiben einer synchronisierten Methode

Kepler und Luna verwenden dieselbe Token-Liste wie Juno ( Liste ).

Andere werden ähnlich sein, aber variieren.

Cletus
quelle
In welchen Fällen wäre es nützlich, eine Nullwarnung zu unterdrücken?
Jesse Jashinsky
@ Jesse: Wenn der Compiler falsch ist (dh eine "'Stupid Flanders' Warnung"). Versuchen Sie zu kompilieren : void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }. Einige Umgebungen (z. B. NetBeans 7.3 mit Java 6 JDK [1.6.0_41]) werden "o possibly null"beim o.toString()Aufruf generiert , obwohl osie zu diesem Zeitpunkt nicht null sein können.
Par
2
@cletus: Ist es möglich, Warnarten in Eclipse hinzuzufügen? Das Problem ist, dass eines unserer Teammitglieder IntelliJ verwendet und dass IDE andere Unterdrückungswarntypen hat, die Warnungen in Eclipse ausgeben :) In Eclipse Indigo können Sie die folgenden Einstellungen vornehmen: Nicht verwendete SuppressWarnings-Token ignorieren, aber das scheint nicht zu funktionieren ...
KC
semicolonscheint nicht in Luna zu arbeiten? :( Kann jemand überprüfen, ob semicolontatsächlich gültig ist?
Kissaki
Was ist der Wert für die Unterdrückung der Warnung "Synchronisation bei nicht endgültigem Feld"?
Matto
48

Alle Werte sind zulässig (nicht erkannte werden ignoriert). Die Liste der erkannten ist compilerspezifisch.

In den Java-Tutorials unchecked und deprecationals die beiden Warnungen aufgeführt, die in der Java-Sprachspezifikation erforderlich sind, sollten sie daher für alle Compiler gültig sein:

Jede Compilerwarnung gehört zu einer Kategorie. In der Java-Sprachspezifikation sind zwei Kategorien aufgeführt: Veraltet und deaktiviert.

Die spezifischen Abschnitte in der Java-Sprachspezifikation, in denen sie definiert sind, sind nicht versionübergreifend konsistent. In der Java SE 8-Spezifikation uncheckedund deprecationsind in den Abschnitten 9.6.4.5 als Compiler-Warnungen aufgeführt. @SuppressWarnings bzw. 9.6.4.6 @Deprecated .

Beim Ausführen javac -Xdes Sun-Compilers wird beim Ausführen eine Liste aller von dieser Version erkannten Werte angezeigt. Für 1.5.0_17 scheint die Liste wie folgt zu sein:

  • alles
  • Missbilligung
  • deaktiviert
  • durchfallen
  • Pfad
  • seriell
  • endlich
Martin McNulty
quelle
43

Die Liste ist compilerspezifisch. Aber hier sind die Werte, die in Eclipse unterstützt werden :

  • allDeprecation veraltet auch innerhalb veralteten Codes
  • allJavadoc ungültig oder fehlendes Javadoc
  • assertIdentifier Vorkommen von assert, das als Bezeichner verwendet wird
  • Boxing Autoboxing Konvertierung
  • charConcat, wenn ein char-Array in einer Zeichenfolgenverkettung verwendet wird, ohne explizit in eine Zeichenfolge konvertiert zu werden
  • Bedingung Weisen Sie eine mögliche versehentliche boolesche Zuweisung zu
  • Konstruktorname- Methode mit Konstruktorname
  • dep-ann fehlt @ Veraltete Anmerkung
  • Veraltete Verwendung eines veralteten Typs oder Mitglieds außerhalb des veralteten Codes
  • entmutigte Verwendung von Typen, die einer entmutigten Zugriffsregel entsprechen
  • emptyBlock undokumentierter leerer Block
  • enumSwitch , unvollständiger Schalter unvollständiger Aufzählungsschalter
  • Durchfall möglicher Durchfallfall
  • fieldHiding Feld versteckt eine andere Variable
  • Parameter vom Typ finalBound mit endgültiger Bindung
  • endlich endlich block nicht normal abschließen
  • Verbotene Verwendung von Typen, die einer Regel für verbotenen Zugriff entsprechen
  • Versteck Makro für fieldHiding, localHiding, typeHiding und maskedCatchBlock
  • indirektStatischer indirekter Verweis auf statisches Element
  • IntfAnnotation- Annotationstyp, der als Superschnittstelle verwendet wird
  • Kompatibilität der nicht vererbten Methode der intfNonInherited- Schnittstelle
  • Javadoc ungültig Javadoc
  • localHiding lokale Variable versteckt eine andere Variable
  • maskedCatchBlocks versteckter Fangblock
  • nls Nicht-Nls-String-Literale (fehlende Tags // $ NON-NLS-)
  • noEffectAssign- Zuweisung ohne Auswirkung
  • Nullpotential fehlt oder redundante Nullprüfung
  • nullDereference fehlt null check
  • Over-Ann fehlt @ Override-Annotation
  • param Zuweisen eines Parameters
  • pkgDefaultMethod versucht, die Paketstandardmethode zu überschreiben
  • Roh Nutzung einer rohen Art (anstelle einem parametrisierte Typ)
  • Semikolon unnötiges Semikolon oder leere Anweisung
  • Seriennummer fehlt serialVersionUID
  • Der Konstruktor- oder Setter-Parameter specialParamHiding verbirgt ein anderes Feld
  • Static-Access- Makro für IndirectStatic und StaticReceiver
  • staticReceiver, wenn ein nicht statischer Empfänger verwendet wird, um ein statisches Feld abzurufen oder eine statische Methode aufzurufen
  • Super- Überschreiben einer Methode ohne Super-Aufruf
  • unterdrücke enable @SuppressWarnings
  • synthetischer Zugriff, synthetischer Zugriff beim Durchführen eines synthetischen Zugriffs für die innere Klasse
  • Aufgaben ermöglichen die Unterstützung von Aufgaben-Tags im Quellcode
  • Parameter typeHiding type, der einen anderen Typ ausblendet
  • deaktiviert nicht aktivierte Typoperation
  • unnötigElse unnötige else-Klausel
  • unqualifizierter Feldzugriff, unqualifizierter Feld unqualifizierter Verweis auf Feld
  • unbenutztes Makro für unusedArgument, unusedImport, unusedLabel, unusedLocal, unusedPrivate und unusedThrown
  • unusedArgument unbenutztes Methodenargument
  • unusedImport nicht verwendete Importreferenz
  • unusedLabel unbenutztes Etikett
  • unusedLocal nicht verwendete lokale Variable
  • unusedPrivate unbenutzte private Mitgliederdeklaration
  • unusedThrown unbenutzte deklarierte ausgelöste Ausnahme
  • nutzlosTypÜberprüfen Sie unnötige Besetzung / Instanz der Operation
  • Das Argument varargsCast varargs muss explizit umgewandelt werden
  • warningToken nicht behandeltes Warnungstoken in @SuppressWarnings

Sun JDK (1.6) hat eine kürzere Liste unterstützter Warnungen:

  • Abschreibung Auf Verwendung abgeschriebener Posten prüfen.
  • deaktiviert Geben Sie weitere Details für nicht aktivierte Konvertierungswarnungen an, die in der Java-Sprachspezifikation vorgeschrieben sind.
  • serial Warnen Sie vor fehlenden serialVersionUID-Definitionen für serialisierbare Klassen.
  • finally Warnen Sie vor finally-Klauseln, die nicht normal ausgeführt werden können.
  • Durchfall Überprüfen Sie die Schalterblöcke auf Durchfallfälle und geben Sie eine Warnmeldung für alle gefundenen Fälle aus.
  • Pfad Suchen Sie in Umgebungspfaden (z. B. Klassenpfad) nach einem nicht vorhandenen Pfad.

Der neueste verfügbare Javac (1.6.0_13) für Mac enthält die folgenden unterstützten Warnungen

  • alles
  • Besetzung
  • Missbilligung
  • Divzero
  • leer
  • deaktiviert
  • durchfallen
  • Pfad
  • seriell
  • endlich
  • überschreibt
D. Wroblewski
quelle
In der Eclipse-Liste werden Compiler-Flags und keine SuppressWarning-Annotationen angezeigt (überprüfen Sie den letzten Teil des von Ihnen verknüpften Dokuments).
Ron Tuffin
3
Beide sind. Durch Setzen der Compiler-Flags teilen Sie dem Compiler mit, welche Art von Warnungen Sie möchten. Mit den Anmerkungen können Sie diese Warnungen an bestimmten Stellen in Ihrem Code unterdrücken.
D. Wroblewski
Ich denke, die Liste ist für Eclipse kürzer. In den neuesten Galileo-Dokumenten finden Sie eine explizite Liste der verfügbaren Token für SupressWarnings: help.eclipse.org/galileo/index.jsp?topic=/…
Peter Štibraný
2
Ich habe @SuppressWarnings ("raw") in Eclipse 3.5 ausprobiert und es funktioniert nicht. Ich erhalte die Warnung, dass "raw" kein gültiger Wert für diese Anmerkung ist.
Jesper
ich auch. Leider ist die JSP-Unterstützung nicht so ausgelöscht wie die Java-Unterstützung.
stu
9

Ein neuer Favorit für mich ist @SuppressWarnings("WeakerAccess")IntelliJ, das verhindert, dass es sich beschwert, wenn es denkt, dass Sie einen schwächeren Zugriffsmodifikator haben sollten, als Sie verwenden. Wir müssen für einige Methoden öffentlich zugänglich sein, um das Testen zu unterstützen, und die @VisibleForTestingAnmerkung verhindert die Warnungen nicht.

ETA: "Anonym" kommentierte auf der mit @MattCampbell verknüpften Seite den folgenden unglaublich nützlichen Hinweis:

Sie sollten diese Liste nicht für den von Ihnen beschriebenen Zweck verwenden müssen. IntelliJ fügt diese SuppressWarnings automatisch für Sie hinzu, wenn Sie dazu aufgefordert werden. Es war in der Lage, dies für so viele Veröffentlichungen zu tun, wie ich mich erinnere.

Gehen Sie einfach zu dem Ort, an dem Sie die Warnung haben, und geben Sie Alt-Enter ein (oder wählen Sie sie in der Inspektionsliste aus, wenn Sie sie dort sehen). Wenn das Menü angezeigt wird und die Warnung angezeigt wird und angeboten wird, sie für Sie zu beheben (z. B. wenn die Warnung "Methode kann statisch sein" lautet, ist "statisch machen" das Angebot von IntellJ, sie für Sie zu beheben), anstatt "Eingabe" auszuwählen. Verwenden Sie einfach die rechte Pfeiltaste, um auf das Untermenü zuzugreifen, das Optionen wie "Inspektionsprofileinstellung bearbeiten" usw. enthält. Am Ende dieser Liste befinden sich Optionen wie "Alle Inspektionen für Klasse unterdrücken", "Für Klasse unterdrücken", "Für Methode unterdrücken" und gelegentlich "Für Anweisung unterdrücken". Sie möchten wahrscheinlich, welche davon zuletzt in der Liste aufgeführt ist. Wenn Sie eine dieser Optionen auswählen, wird Ihrem Code eine @ SuppressWarnings-Anmerkung (oder in einigen Fällen ein Kommentar) hinzugefügt, wodurch die betreffende Warnung unterdrückt wird. Sie müssen nicht raten, welche Anmerkung hinzugefügt werden soll, da IntelliJ die Auswahl anhand der von Ihnen ausgewählten Warnung trifft.

Barclay
quelle
2

Mir ist aufgefallen, dass //noinspectiondies in IntelliJ automatisch generiert werden kann

  • Stellen Sie sicher, dass Sie @SuppressWarninigsvor der Erklärung noch keinen Plan haben
  • Jetzt können Sie das Spezifische automatisch generieren, //noinspectionindem Sie Alt + Eingabetaste drücken , wenn Sie die Warnung ausgewählt haben, und dann die rechte Pfeiltaste verwenden , um die Option Unterdrücken für ... anzuzeigen

Endete hier, als ich eine Warnung von IntelliJ unterdrücken wollte, dass "Schalter zu wenige Fallbezeichnungen hat". Ich habe keine vollständige Liste für die @SuppressWarningUnterstützung von IntelliJ gefunden, aber //noinspectionden Trick für mich getan.

hb0
quelle
Sie können auch @SuppressWarnings ("SwitchStatementWithTooFewBranches") hinzufügen.
JPM
Leider ist die Option Unterdrücken für ... beim Klicken auf ALT + EINGABETASTE nicht immer verfügbar
fehlerhaft
//noinspection SwitchStatementWithTooFewBranchesvor den switchArbeiten auch für mich.
Oliver Hausler
1

Und dies scheint eine viel vollständigere Liste zu sein, in der ich einige für Android-Studio spezifische Warnungen gefunden habe, die ich anderswo nicht finden konnte (z. B. SynchronizeOnNonFinalField).

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

Oh, jetzt widersprechen die Richtlinien von SO den Einschränkungen von SO. Einerseits soll ich die Liste kopieren, anstatt nur den Link bereitzustellen. Andererseits würde dies die maximal zulässige Anzahl von Zeichen überschreiten. Hoffen wir also nur, dass der Link nicht unterbrochen wird.

matteo
quelle
1

JSL 1.7

In der Oracle-Dokumentation wird Folgendes erwähnt:

  • unchecked: Nicht aktivierte Warnungen werden durch die Zeichenfolge "nicht aktiviert" gekennzeichnet.
  • deprecation: Ein Java-Compiler muss eine Verfallswarnung erzeugen, wenn ein Typ, eine Methode, ein Feld oder ein Konstruktor verwendet wird, dessen Deklaration mit der Annotation @Deprecated versehen ist (dh überschrieben, aufgerufen oder namentlich referenziert), es sei denn: [...] The Die Verwendung erfolgt innerhalb einer Entität, die mit Anmerkungen versehen ist, um die Warnung mit der Anmerkung @SuppressWarnings ("Verfall") zu unterdrücken. oder

Anschließend wird erläutert, dass Implementierungen eigene hinzufügen und dokumentieren können:

Compiler-Anbieter sollten die von ihnen unterstützten Warnnamen in Verbindung mit diesem Anmerkungstyp dokumentieren. Anbieter werden aufgefordert, zusammenzuarbeiten, um sicherzustellen, dass dieselben Namen auf mehreren Compilern funktionieren.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
1
Es ist nicht wahr, dass dies uncheckedder einzige ist, der von der Norm gebilligt wird. Der nächste Abschnitt von dem, den Sie zitiert haben, besagt, dass keine @SuppressWarnings("deprecation")
Verfallswarnungen ausgegeben werden
1

Ich möchte nur hinzufügen, dass es eine Hauptliste der IntelliJ-Unterdrückungsparameter gibt: https://gist.github.com/vegaasen/157fbc6dce8545b7f12c

Es sieht ziemlich umfassend aus. Teilweise:

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
quelle
1

Wenn Sie SonarLint verwenden, versuchen Sie es über der Methode oder klassifizieren Sie die gesamte Tintenfischzeichenfolge: @SuppressWarnings ("squid: S1172")

R Strauss
quelle