¿Cuál es la lista de nombres de advertencia válidos de @SuppressWarnings en Java?

264

¿Cuál es la lista de @SuppressWarningsnombres de advertencia válidos en Java?

El bit que se interpone entre el ("")in @SuppressWarnings("").

Ron Tuffin
fuente
3
Esta pregunta es realmente agradable y las respuestas son útiles. Si alguien del JCP lo mira, debe darse cuenta de lo complicado que es agregar una advertencia de supresión. No existe una convención sobre caso, guión, caso de camello, es simplemente un desastre, sería maravilloso estandarizar esto.
Snicolas
Veo "ProhibitedExceptionDeclared"dentro de Eclipse Collections Framework ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction), y eso no se enumera a continuación.
kevinarpe

Respuestas:

250

Depende de su IDE o compilador.

Aquí hay una lista para Eclipse Galileo:

  • todo para suprimir todas las advertencias
  • boxeo para suprimir advertencias relativas a operaciones de boxeo / unboxing
  • emitir para suprimir advertencias relativas a las operaciones de lanzamiento
  • dep-ann para suprimir advertencias relativas a anotaciones en desuso
  • desaprobación para suprimir advertencias relativas a la desaprobación
  • fallthrough para suprimir advertencias relativas a las interrupciones faltantes en las declaraciones de cambio
  • finalmente para suprimir advertencias relativas a finalmente bloquear que no regresan
  • ocultar para suprimir advertencias relativas a locales que ocultan variables
  • interruptor incompleto para suprimir advertencias relativas a entradas faltantes en una declaración de interruptor (caso de enumeración)
  • nls para suprimir advertencias relativas a literales de cadena no nls
  • nulo para suprimir advertencias relativas al análisis nulo
  • restricción para suprimir advertencias relativas al uso de referencias desalentadas o prohibidas
  • serial para suprimir advertencias relativas al campo serialVersionUID faltante para una clase serializable
  • acceso estático para suprimir advertencias relativas a un acceso estático incorrecto
  • acceso sintético para suprimir advertencias relativas al acceso no optimizado desde clases internas
  • desmarcado para suprimir advertencias relativas a operaciones desmarcadas
  • acceso de campo no calificado para suprimir advertencias relativas al acceso de campo no calificado
  • no utilizado para suprimir advertencias relativas al código no utilizado

La lista para Indigo agrega:

  • javadoc para suprimir las advertencias relativas a las advertencias de javadoc
  • tipos sin formato para suprimir advertencias relativas al uso de tipos sin formato
  • método estático para suprimir advertencias relativas a métodos que podrían declararse como estáticos
  • super para suprimir advertencias relativas a anular un método sin invocaciones súper

La lista de Juno agrega:

  • recurso para suprimir advertencias relativas al uso de recursos de tipo Cerrable
  • sync-override para suprimir advertencias debido a la falta de sincronización al anular un método sincronizado

Kepler y Luna usan la misma lista de tokens que Juno ( lista ).

Otros serán similares pero varían.

cletus
fuente
¿En qué casos sería útil suprimir una advertencia nula?
Jesse Jashinsky
@Jesse: Cuando el compilador está equivocado (es decir, una "advertencia de 'Estúpidos Flandes'"). Tratar de compilar: void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }. Algunos entornos (por ejemplo, NetBeans 7.3 w / Java 6 JDK [1.6.0_41]) se generarán "o possibly null"en la o.toString()llamada aunque ono puedan ser nulos en ese punto.
par
2
@cletus: ¿Es posible agregar tipos de advertencias en eclipse? El problema es que uno de los miembros de nuestro equipo usa IntelliJ, y que IDE tiene otros tipos de advertencia de supresión que dan advertencias en Eclipse :) En Eclipse Indigo puede establecer las preferencias: Ignorar los tokens SuppressWarnings no utilizados, pero eso no parece funcionar ...
KC
semicolonno parece funcionar en luna? :( ¿Alguien puede verificar si semicolones realmente válido?
Kissaki
¿Cuál es el valor para suprimir la advertencia de "sincronización en campo no final"?
matteo
48

Todos los valores están permitidos (los no reconocidos se ignoran). La lista de reconocidos es específica del compilador.

En The Java Tutorials unchecked y deprecationse enumeran como las dos advertencias requeridas por The Java Language Specification, por lo tanto, deben ser válidas con todos los compiladores:

Cada advertencia del compilador pertenece a una categoría. La especificación del lenguaje Java enumera dos categorías: desaprobación y desmarcado.

Las secciones específicas dentro de la especificación del lenguaje Java donde se definen no son consistentes entre las versiones. En la especificación Java SE 8 uncheckedy deprecationse enumeran como advertencias del compilador en las secciones 9.6.4.5. @SuppressWarnings y 9.6.4.6 @Deprecated , respectivamente.

Para el compilador de Sun, la ejecución javac -Xproporciona una lista de todos los valores reconocidos por esa versión. Para 1.5.0_17, la lista parece ser:

  • todas
  • deprecación
  • desenfrenado
  • caer a través
  • camino
  • de serie
  • finalmente
Martin McNulty
fuente
43

La lista es específica del compilador. Pero aquí están los valores soportados en Eclipse :

  • allDeprecation desaprobación incluso dentro de código desaprobado
  • allJavadoc no es válido o falta javadoc
  • aserción del identificador de aserción utilizada como identificador
  • conversión de boxeo autoboxing
  • charConcat cuando se usa una matriz de caracteres en una concatenación de cadenas sin convertirse explícitamente en una cadena
  • conditionAssign posible asignación booleana accidental
  • método constructorName con el nombre del constructor
  • a dep-ann le falta anotación @Deprecated
  • deprecation uso de tipo desaprobado o miembro de código fuera obsoleto
  • uso desaconsejado de tipos que coincidan con una regla de acceso desaconsejada
  • emptyBlock bloque vacío no documentado
  • enumSwitch , interruptor incompleto interruptor enum incompleto
  • caso de caída posible
  • fieldHiding campo ocultando otra variable
  • parámetro de tipo finalBound con límite final
  • finalmente finalmente bloquear no completar normalmente
  • uso prohibido de tipos que coinciden con una regla de acceso prohibido
  • macro oculta para fieldHiding, localHiding, typeHiding y maskedCatchBlock
  • indirecta Referencia indirecta estática al miembro estático
  • intf Tipo de anotación de anotación utilizada como super interfaz
  • intfNonInherited compatibilidad de métodos no heredados de interfaz
  • javadoc inválido javadoc
  • ocultar la variable local ocultando otra variable
  • bloque de captura oculto maskedCatchBlocks
  • literales de cadena nls no nls (falta de etiquetas // $ NON-NLS-)
  • noEffect Asignación de asignación sin efecto
  • potencial nulo falta o verificación nula redundante
  • nullDereference falta comprobación nula
  • sobre-ann falta de anotación @ Override
  • asignación de paramAssign a un parámetro
  • pkgDefaultMethod intenta anular el método predeterminado del paquete
  • uso sin formato a de tipo sin formato (en lugar de un tipo parametrizado)
  • punto y coma innecesario punto y coma o declaración vacía
  • serial missing serialVersionUID
  • EspecialParamHiding constructor o parámetro setter ocultando otro campo
  • macro de acceso estático para indirectaStatic y staticReceiver
  • staticReceiver si se usa un receptor no estático para obtener un campo estático o llamar a un método estático
  • super anulando un método sin hacer una super invocación
  • suprimir enable @SuppressWarnings
  • syntheticAccess, de acceso sintético cuando se realiza el acceso sintético para innerclass
  • las tareas permiten el soporte de etiquetas de tareas en el código fuente
  • typeHiding tipo parámetro ocultando otro tipo
  • operación de tipo sin marcar sin marcar
  • innecesaria Otra cláusula innecesaria
  • acceso de campo no calificado, campo no calificado Referencia de campo no calificado
  • macro no utilizada para argumento no utilizado, importación no utilizada, etiqueta no utilizada, local no utilizado, privado no utilizado y arrojado
  • argumento no utilizado Argumento método no utilizado
  • unusedImport no utilizado de referencia de importación
  • etiqueta de etiqueta sin usar
  • unusedLocal variable local sin uso
  • Declaración de miembro privado no utilizado privado
  • sin usar Lanzado sin usar declarado excepción lanzada
  • uselessTypeCheck conversión / instancia de operación innecesaria
  • El argumento varargs de varargs debe emitirse explícitamente
  • warningToken token de advertencia no manejado en @SuppressWarnings

Sun JDK (1.6) tiene una lista más corta de advertencias compatibles:

  • desaprobación Verifique el uso de artículos depreciados.
  • desmarcado Proporcione más detalles para las advertencias de conversión desmarcadas exigidas por la Especificación del lenguaje Java.
  • serial Advierte sobre la falta de definiciones serialVersionUID en clases serializables.
  • finalmente Avisar sobre finalmente cláusulas que no pueden completarse normalmente.
  • Verifique los bloques de interruptores para ver si hay casos fallidos y proporcione un mensaje de advertencia para los que se encuentren.
  • ruta Compruebe si hay una ruta inexistente en las rutas del entorno (como classpath).

Los últimos javac disponibles (1.6.0_13) para mac tienen las siguientes advertencias compatibles

  • todas
  • emitir
  • deprecación
  • divzero
  • vacío
  • desenfrenado
  • caer a través
  • camino
  • de serie
  • finalmente
  • anula
D. Wroblewski
fuente
La lista de Eclipse aquí busca indicadores del compilador y no anotaciones SuppressWarning (verifique la última parte del documento que ha vinculado).
Ron Tuffin el
3
Ellos dos. Al configurar los indicadores del compilador, le indica al compilador qué tipo de advertencias desea. Con las anotaciones puede suprimir estas advertencias en lugares específicos de su código.
D. Wroblewski, el
Creo que la lista es más corta para Eclipse. Vea los últimos documentos de galileo, la lista de tokens disponibles para SupressWarnings está explícita allí: help.eclipse.org/galileo/index.jsp?topic=/…
Peter Štibraný
2
Intenté @SuppressWarnings ("raw") en Eclipse 3.5 y no funciona. Recibo una advertencia de que "raw" no es un valor válido para esta anotación.
Jesper
yo también. Desafortunadamente, el soporte de jsp no está tan limpio como el soporte de Java.
stu
9

Un nuevo favorito para mí está @SuppressWarnings("WeakerAccess")en IntelliJ, que evita que se queje cuando cree que debería tener un modificador de acceso más débil del que está utilizando. Tenemos que tener acceso público a algunos métodos para admitir las pruebas, y el@VisibleForTesting anotación no evita las advertencias.

ETA: "Anónimo" comentó, en la página @MattCampbell vinculada a, la siguiente nota increíblemente útil:

No debería necesitar usar esta lista para el propósito que está describiendo. IntelliJ agregará esas SuppressWarnings automáticamente si se lo solicita. Ha sido capaz de hacer esto durante tantos lanzamientos como recuerdo.

Simplemente vaya a la ubicación donde tiene la advertencia y escriba Alt-Enter (o selecciónelo en la lista de Inspecciones si lo está viendo allí). Cuando aparece el menú, que muestra la advertencia y ofrece arreglarlo por usted (por ejemplo, si la advertencia es "El método puede ser estático", entonces "hacer estática" es la oferta de IntellJ para solucionarlo), en lugar de seleccionar "enter", solo use el botón de flecha derecha para acceder al submenú, que tendrá opciones como "Editar configuración de perfil de inspección", etc. Al final de esta lista habrá opciones como "Suprimir todas las inspecciones para la clase", "Suprimir para la clase", "Suprimir para el método" y, en ocasiones, "Suprimir para la instrucción". Probablemente desee cualquiera de estos que aparezca último en la lista. Al seleccionar uno de estos, se agregará una anotación @SuppressWarnings (o comentario en algunos casos) a su código suprimiendo la advertencia en cuestión. No necesitará adivinar qué anotación agregar, porque IntelliJ elegirá en función de la advertencia que seleccionó.

Barclay
fuente
2

Noté que //noinspectionse puede generar automáticamente en IntelliJ

  • asegúrese de no tener un plan @SuppressWarninigsantes de la declaración
  • Ahora puede generar automáticamente el específico //noinspectionpresionando Alt + Enter cuando haya seleccionado la advertencia y luego use la tecla de flecha derecha para ver la opción Suprimir para ...

Terminé aquí cuando quería suprimir una advertencia de "interruptor tiene muy pocas etiquetas de caso" de IntelliJ. No encontré una lista completa para el @SuppressWarningsoporte de IntelliJ pero //noinspectionhice el truco por mí.

hb0
fuente
También puede agregar @SuppressWarnings ("SwitchStatementWithTooFewBranches") para eso.
JPM
Desafortunadamente, la opción Suprimir para ... al hacer clic en ALT + ENTRAR no siempre está disponible
flawyte
//noinspection SwitchStatementWithTooFewBranchesantes de las switchobras también para mí.
Oliver Hausler
1

Y esta parece ser una lista mucho más completa, donde encontré algunas advertencias específicas para Android-Studio que no pude encontrar en ningún otro lado (por ejemplo, SynchronizeOnNonFinalField)

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

Oh, ahora las pautas de SO contradicen las restricciones de SO. Por un lado, se supone que debo copiar la lista en lugar de proporcionar solo el enlace. Pero, por otro lado, esto excedería el número máximo permitido de caracteres. Esperemos que el enlace no se rompa.

matteo
fuente
1

JSL 1.7

La documentación de Oracle menciona:

  • unchecked: Las advertencias no verificadas se identifican con la cadena "sin marcar".
  • deprecation: Un compilador de Java debe generar una advertencia de desuso cuando se utiliza un tipo, método, campo o constructor cuya declaración está anotada con la anotación @Deprecated (es decir, anulada, invocada o referenciada por nombre), a menos que: [...] el uso está dentro de una entidad que está anotada para suprimir la advertencia con la anotación @SuppressWarnings ("desaprobación"); o

Luego explica que las implementaciones pueden agregar y documentar las suyas propias:

Los proveedores de compiladores deben documentar los nombres de advertencia que admiten junto con este tipo de anotación. Se alienta a los proveedores a cooperar para garantizar que los mismos nombres funcionen en múltiples compiladores.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
1
No es cierto que uncheckedsea ​​el único avalado por la norma; la siguiente sección de la que citó dice que las advertencias de desaprobación no deben producirse cuando "El uso está dentro de una entidad que está anotada para suprimir la advertencia con la anotación @SuppressWarnings("deprecation")"
kbolino
1

Solo quiero agregar que hay una lista maestra de parámetros de supresión de IntelliJ en: https://gist.github.com/vegaasen/157fbc6dce8545b7f12c

Se ve bastante completo. Parcial:

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

Si está utilizando SonarLint, intente por encima del método o clasifique toda la cadena de calamar: @SuppressWarnings ("squid: S1172")

R Strauss
fuente