Qual è l'elenco dei nomi di avviso validi @SuppressWarnings in Java?


264

Qual è l'elenco di @SuppressWarningsnomi di avvisi validi in Java?

Il bit che si frappone tra ("")in @SuppressWarnings("").


3
Questa domanda è davvero piacevole e le risposte sono utili. Se qualcuno del JCP lo guarda, dovresti capire quanto è disordinato aggiungere un avviso di soppressione. Non esiste una convenzione su caso, trattino, caso di cammello, è solo un semplice pasticcio, sarebbe bello standardizzarlo.
Snicolas,

Vedo "ProhibitedExceptionDeclared"all'interno di Eclipse Collections Framework ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction) e non è elencato di seguito.
kevinarpe,

Risposte:


250

Dipende dal tuo IDE o compilatore.

Ecco un elenco di Eclipse Galileo:

  • tutto per sopprimere tutti gli avvisi
  • boxing per eliminare gli avvisi relativi alle operazioni di boxing / unboxing
  • cast per eliminare gli avvisi relativi alle operazioni di cast
  • dep-ann per sopprimere gli avvisi relativi all'annotazione obsoleta
  • deprecazione per sopprimere gli avvisi relativi alla deprecazione
  • fallthrough per sopprimere gli avvisi relativi a interruzioni mancanti nelle istruzioni switch
  • infine per sopprimere gli avvisi relativi al blocco finalmente che non ritornano
  • nascondersi per sopprimere gli avvisi relativi ai locali che nascondono la variabile
  • switch incompleto per sopprimere gli avvisi relativi alle voci mancanti in un'istruzione switch (caso enum)
  • nls per sopprimere gli avvisi relativi ai letterali stringa non nls
  • null per sopprimere gli avvisi relativi all'analisi null
  • restrizione alla soppressione degli avvisi relativi all'uso di riferimenti scoraggiati o proibiti
  • serial per sopprimere gli avvisi relativi al campo serialVersionUID mancante per una classe serializzabile
  • accesso statico per eliminare gli avvisi relativi a un accesso statico errato
  • accesso sintetico per sopprimere gli avvisi relativi all'accesso non ottimizzato dalle classi interne
  • deselezionato per eliminare gli avvisi relativi alle operazioni non controllate
  • accesso al campo non qualificato per eliminare gli avvisi relativi all'accesso al campo non qualificato
  • non utilizzato per sopprimere gli avvisi relativi al codice non utilizzato

L'elenco per Indigo aggiunge:

  • javadoc per eliminare gli avvisi relativi agli avvisi javadoc
  • rawtypes per sopprimere gli avvisi relativi all'utilizzo di tipi non elaborati
  • metodo statico per sopprimere gli avvisi relativi ai metodi che potrebbero essere dichiarati come statici
  • super per sopprimere gli avvisi relativi alla sostituzione di un metodo senza super invocazioni

Elenco per Juno aggiunge:

  • risorsa per sopprimere gli avvisi relativi all'utilizzo di risorse di tipo Chiudibile
  • sync-override per sopprimere gli avvisi a causa della mancata sincronizzazione durante l'override di un metodo sincronizzato

Keplero e Luna usano lo stesso elenco di token di Giunone ( elenco ).

Altri saranno simili ma vari.


In quali casi sarebbe utile sopprimere un avviso nullo?
Jesse Jashinsky,

@Jesse: quando il compilatore è sbagliato (ad es. Un "avviso di Fiandre stupide"). Prova la compilazione: void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }. Alcuni ambienti (ad es. NetBeans 7.3 con Java 6 JDK [1.6.0_41]) genereranno "o possibly null"alla o.toString()chiamata anche se onon possono essere nulli in quel punto.
par

2
@cletus: è possibile aggiungere tipi di avvisi in eclissi? Il problema è che uno dei membri del nostro team utilizza IntelliJ e che IDE ha altri tipi di avvisi di soppressione che forniscono avvisi in Eclipse :) In Eclipse Indigo è possibile impostare le preferenze: Ignora token SuppressWarnings non utilizzati, ma ciò non sembra funzionare ...
KC

semicolonnon sembra funzionare in luna? :( Qualcuno può verificare se semicolonè effettivamente valido?
Kissaki,

Qual è il valore per sopprimere l'avviso "Sincronizzazione su campo non finale"?
Matteo

48

Tutti i valori sono consentiti (quelli non riconosciuti vengono ignorati). L'elenco di quelli riconosciuti è specifico del compilatore.

In The Java Tutorials unchecked e deprecationsono elencati come i due avvisi richiesti da The Java Language Specification, pertanto, dovrebbero essere validi con tutti i compilatori:

Ogni avviso del compilatore appartiene a una categoria. Le specifiche del linguaggio Java elencano due categorie: deprecazione e deselezionata.

Le sezioni specifiche all'interno di The Java Language Specification in cui sono definite non sono coerenti tra le versioni. Nelle specifiche Java SE 8 uncheckede deprecationsono elencati come avvisi del compilatore nelle sezioni 9.6.4.5. @SuppressWarnings e 9.6.4.6 @Deprecated , rispettivamente.

Per il compilatore di Sun, l'esecuzione javac -Xfornisce un elenco di tutti i valori riconosciuti da quella versione. Per 1.5.0_17, l'elenco sembra essere:

  • tutti
  • deprecazione
  • non verificato
  • sfumare
  • sentiero
  • seriale
  • finalmente

43

L'elenco è specifico del compilatore. Ma ecco i valori supportati in Eclipse :

  • allDeprecation deprecation anche all'interno del codice deprecato
  • allJavadoc javadoc non valido o mancante
  • AssertIdentifier occorrenza di assert utilizzata come identificativo
  • conversione boxe autoboxing
  • charConcat quando un array di caratteri viene utilizzato in una concatenazione di stringhe senza essere convertito esplicitamente in una stringa
  • condizione Assegna possibile assegnazione booleana accidentale
  • Metodo constructorName con nome costruttore
  • dep-ann mancante @ Annotazione obsoleta
  • deprecation utilizzo di tipo sconsigliato o membro esterno sconsigliata codice
  • uso scoraggiato di tipi corrispondenti a una regola di accesso scoraggiato
  • emptyBlock blocco vuoto non documentato
  • enumSwitch , switch enum incompleto a switch incompleto
  • fallthrough possibile caso fall-through
  • fieldHiding field nasconde un'altra variabile
  • Parametro del tipo finalBound con limite finale
  • finalmente finalmente il blocco non si completa normalmente
  • uso proibito di tipi corrispondenti a una regola di accesso proibito
  • macro nascosta per fieldHiding, localHiding, typeHiding e maskedCatchBlock
  • indiretto Riferimento indiretto statico all'elemento statico
  • intfAnnotation tipo di annotazione utilizzato come super interfaccia
  • compatibilità con il metodo non ereditato dell'interfaccia intfNonInherited
  • javadoc javadoc non valido
  • localHiding variabile locale nasconde un'altra variabile
  • maskedCatchBlocks blocco catch nascosto
  • letterali stringa nls non-nls (senza tag // $ NON-NLS-)
  • noEffectAssegna un'assegnazione senza effetto
  • null potenziale controllo mancante o ridondante
  • nullDereference mancante controllo null
  • over-ann mancante annotazione @Override
  • paramAssegnare l' assegnazione a un parametro
  • pkgDefaultMethod tenta di ignorare il metodo pacchetto predefinito
  • crudo utilizzo di un tipo di greggio (invece che un tipo parametrizzata)
  • punto e virgola punto e virgola non necessari o istruzione vuota
  • serialVersionUID seriale mancante
  • specialParamHiding parametro del costruttore o setter che nasconde un altro campo
  • macro ad accesso statico per indiretto statico e staticReceiver
  • staticReceiver se si utilizza un ricevitore non statico per ottenere un campo statico o chiamare un metodo statico
  • super- override un metodo senza fare un super invocazione
  • sopprimere abilitare @SuppressWarnings
  • syntheticAccess, accesso sintetico quando si esegue l'accesso sintetico per innerclass
  • task abilita il supporto per i tag task nel codice sorgente
  • typeHiding parametro di tipo che nasconde un altro tipo
  • operazione di tipo non selezionata non selezionata
  • superflua Clausola inutile
  • riferimento al campo non qualificato, accesso al campo non qualificato, campo non qualificato
  • macro inutilizzata per unusedusedArgument, unusedImport, unusedLabel, unusedLocal, unusedPrivate e unusedThrown
  • argomento del metodo inutilizzato unusedArgument
  • unusedImporta riferimento all'importazione inutilizzata
  • Etichetta inutilizzata dell'etichetta
  • unusedLocal variabile locale inutilizzato
  • dichiarazione inutilizzata privata non utilizzata
  • unusedThrown inutilizzato eccezione generata dichiarato
  • uselessType Controlla l' operazione cast / instanceof non necessaria
  • varargsCast L'argomento varargs necessita di cast esplicito
  • warningToken token di avviso non gestito in @SuppressWarnings

Sun JDK (1.6) ha un elenco più breve di avvisi supportati:

  • deprezzamento Verificare l'utilizzo di articoli ammortizzati.
  • deselezionato Fornisci maggiori dettagli per gli avvisi di conversione non controllati richiesti da Java Language Specification.
  • serial Avvisa che mancano le definizioni serialVersionUID su classi serializzabili.
  • infine Avvertire sulle clausole che non possono essere completate normalmente.
  • fallthrough Controllare i blocchi di interruttori per casi fall-through e fornire un messaggio di avviso per quelli che si trovano.
  • percorso Cerca un percorso inesistente nei percorsi di ambiente (come il percorso di classe).

L'ultima versione disponibile di javac (1.6.0_13) per mac ha i seguenti avvisi supportati

  • tutti
  • getto
  • deprecazione
  • divzero
  • vuoto
  • non verificato
  • sfumare
  • sentiero
  • seriale
  • finalmente
  • le sostituzioni

L'elenco Eclipse qui guarda ai flag del compilatore e non alle annotazioni SuppressWarning (controlla l'ultima parte del documento che hai collegato).
Ron Tuffin,

3
Sono entrambi. Impostando i flag del compilatore dici al compilatore che tipo di avvisi vuoi. Con le annotazioni puoi sopprimere questi avvisi in punti specifici del tuo codice.
D. Wroblewski

Penso che l'elenco sia più breve per Eclipse. Vedi gli ultimi documenti galileo, l'elenco dei token disponibili per SupressWarnings è esplicito qui: help.eclipse.org/galileo/index.jsp?topic=/…
Peter Štibraný

2
Ho provato @SuppressWarnings ("raw") in Eclipse 3.5 e non funziona - ricevo un avviso che "raw" non è un valore valido per questa annotazione.
Jesper,

anch'io. Unfortunatel che il supporto jsp non è svuotato come il supporto java.
martedì

9

Un nuovo preferito per me è @SuppressWarnings("WeakerAccess")in IntelliJ, che gli impedisce di lamentarsi quando pensa che dovresti avere un modificatore di accesso più debole di quello che stai usando. Dobbiamo avere accesso pubblico per alcuni metodi per supportare i test e l' @VisibleForTestingannotazione non impedisce gli avvisi.

ETA: "Anonimo" ha commentato, sulla pagina @MattCampbell collegata, la seguente nota incredibilmente utile:

Non dovresti aver bisogno di usare questo elenco per lo scopo che stai descrivendo. IntelliJ aggiungerà quelle SuppressWarnings automaticamente per te se lo chiedi. È stato in grado di farlo per tutte le versioni che ricordo.

Vai alla posizione in cui hai l'avviso e digita Alt-Invio (o selezionalo nell'elenco Ispezioni se lo vedi lì). Quando viene visualizzato il menu, che mostra l'avviso e si offre di correggerlo (ad es. Se l'avviso è "Il metodo può essere statico", allora "rendere statico" è l'offerta di IntellJ di ripararlo per te), invece di selezionare "invio", basta usare il pulsante freccia destra per accedere al sottomenu, che avrà opzioni come "Modifica impostazione profilo ispezione" e così via. In fondo a questo elenco ci saranno opzioni come "Sopprimi tutte le ispezioni per la classe", "Sopprimi per classe", "Sopprimi per metodo" e occasionalmente "Sopprimi per istruzione". Probabilmente vuoi quello che appare per ultimo nell'elenco. Selezionando una di queste si aggiungerà un'annotazione @SuppressWarnings (o un commento in alcuni casi) al codice che sopprime l'avviso in questione. Non sarà necessario indovinare a quale annotazione aggiungere, perché IntelliJ sceglierà in base all'avviso selezionato.


2

Ho notato che //noinspectionpuò essere generato automaticamente in IntelliJ

  • assicurati di non avere già un piano @SuppressWarninigsprima della dichiarazione
  • Ora puoi generare automaticamente lo specifico //noinspectionpremendo Alt + Invio quando hai selezionato l'avviso e quindi usa il tasto freccia destra per vedere l' opzione Sopprimi per ...

Siamo finiti qui quando volevo sopprimere un avviso "switch ha troppo poche etichette" da IntelliJ. Non ho trovato un elenco completo per il @SuppressWarningsupporto di IntelliJ, ma //noinspectionho fatto il trucco per me.


Puoi anche aggiungere @SuppressWarnings ("SwitchStatementWithTooFewBranches").
JPM,

Sfortunatamente l' opzione Elimina per ... quando si fa clic su ALT + INVIO non è sempre disponibile
flawyte

//noinspection SwitchStatementWithTooFewBranchesprima che switchfunzioni anche per me.
Oliver Hausler

1

E questo sembra essere un elenco molto più completo, in cui ho trovato alcuni avvisi specifici per Android-Studio che non sono riuscito a trovare altrove (ad esempio SynchronizeOnNonFinalField)

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

Oh, ora le linee guida di SO contraddicono le restrizioni di SO. Da un lato, dovrei copiare l'elenco piuttosto che fornire solo il link. D'altra parte, questo supererebbe il numero massimo consentito di caratteri. Quindi speriamo solo che il link non si interrompa.


1

JSL 1.7

La documentazione di Oracle menziona:

  • unchecked: Gli avvisi non selezionati sono identificati dalla stringa "non selezionata".
  • deprecation: Un compilatore Java deve generare un avviso di deprecazione quando viene utilizzato un tipo, metodo, campo o costruttore la cui dichiarazione è annotata con l'annotazione @Deprecated (ovvero sovrascritta, invocata o referenziata per nome), a meno che: [...] l'uso è all'interno di un'entità che è annotata per sopprimere l'avviso con l'annotazione @SuppressWarnings ("deprecazione"); o

Spiega quindi che le implementazioni possono aggiungere e documentare le proprie:

I fornitori di compilatori devono documentare i nomi di avviso che supportano insieme a questo tipo di annotazione. I fornitori sono incoraggiati a collaborare per garantire che gli stessi nomi funzionino su più compilatori.


1
Non è vero che uncheckedè l'unico approvato dalla norma; la sezione @SuppressWarnings("deprecation")
immediatamente

1

Voglio solo aggiungere che esiste un elenco principale di parametri di soppressione IntelliJ su: https://gist.github.com/vegaasen/157fbc6dce8545b7f12c

Sembra abbastanza completo. Parziale:

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

1

Se stai usando SonarLint, prova sopra il metodo o classifica l'intera stringa di calamari: @SuppressWarnings ("squid: S1172")

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.