Qual é a lista de nomes de aviso válidos @SuppressWarnings em Java?


264

Qual é a lista de @SuppressWarningsnomes de aviso válidos em Java?

O pouco que se encontrem entre o ("")no @SuppressWarnings("").


3
Esta pergunta é muito boa e as respostas são úteis. Se alguém do JCP olhar para ele, você deve perceber o quão confuso é adicionar um aviso de supressão. Não há nenhuma convenção sobre caso, hífen, caso de camelo, é apenas uma bagunça, seria adorável padronizar isso.
Snicolas 20/09/16

Vejo "ProhibitedExceptionDeclared"no Eclipse Collections Framework ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction) e isso não está listado abaixo.
Kevinarpe

Respostas:


250

Depende do seu IDE ou compilador.

Aqui está uma lista para o Eclipse Galileo:

  • tudo para suprimir todos os avisos
  • boxe para suprimir avisos relativos a operações de boxe / unboxing
  • conversão para suprimir avisos relativos às operações de conversão
  • dep-ann para suprimir avisos relativos à anotação obsoleta
  • descontinuação para suprimir avisos relativos à descontinuação
  • descoberta para suprimir avisos relativos a quebras ausentes nas instruções do switch
  • finalmente para suprimir avisos relativos ao bloco finalmente que não retornam
  • ocultando para suprimir avisos relativos aos locais que ocultam variáveis
  • switch incompleto para suprimir avisos relativos a entradas ausentes em uma instrução switch (caso de enum)
  • nls para suprimir avisos relativos a literais de cadeia não nls
  • nulo para suprimir avisos relativos à análise nula
  • restrição para suprimir avisos relativos ao uso de referências desanimadas ou proibidas
  • serial para suprimir avisos relativos ao campo serialVersionUID ausente para uma classe serializável
  • acesso estático para suprimir avisos relativos a acesso estático incorreto
  • acesso sintético para suprimir avisos relativos ao acesso não otimizado de classes internas
  • desmarcado para suprimir avisos relativos a operações não verificadas
  • acesso não qualificado ao campo para suprimir avisos relativos ao acesso ao campo não qualificado
  • não utilizado para suprimir avisos relativos ao código não utilizado

A lista para Indigo acrescenta:

  • javadoc para suprimir avisos relativos a avisos javadoc
  • tipos - primas para suprimir avisos relativos ao uso de tipos-primas
  • static-method para suprimir avisos relativos a métodos que poderiam ser declarados como estáticos
  • super para suprimir avisos relativos à substituição de um método sem super-invocações

A lista de Juno acrescenta:

  • recurso para suprimir avisos relativos ao uso de recursos do tipo
  • substituição de sincronização para suprimir avisos devido à falta de sincronização ao substituir um método sincronizado

Kepler e Luna usam a mesma lista de tokens que Juno ( lista ).

Outros serão semelhantes, mas variam.


Em que casos a supressão de um aviso nulo seria útil?
Jesse Jashinsky

@ Jessé: Quando o compilador está errado (ou seja, um "aviso de 'Stupid Flanders'"). Tente compilar: void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }. Alguns ambientes (por exemplo, NetBeans 7.3 com Java 6 JDK [1.6.0_41]) serão gerados "o possibly null"na o.toString()chamada, embora onão possam ser nulos nesse momento.
par

2
@cletus: É possível adicionar tipos de avisos no eclipse? O problema é que um dos membros de nossa equipe usa IntelliJ e que o IDE possui outros tipos de aviso de supressão que emitem avisos no Eclipse :) No Eclipse Indigo, você pode definir as preferências: Ignorar tokens SuppressWarnings não utilizados, mas isso não parece funcionar ...
KC

semicolonparece não funcionar em luna? :( Alguém pode verificar se semicoloné realmente válido?
Kissaki

Qual é o valor para suprimir o aviso "sincronização em campo não final"?
Matteo

48

Todos os valores são permitidos (os não reconhecidos são ignorados). A lista de reconhecidos é específica do compilador.

Nos Tutoriais Java unchecked e deprecationsão listados como os dois avisos exigidos pelo Java Language Specification, portanto, eles devem ser válidos com todos os compiladores:

Todo aviso do compilador pertence a uma categoria. A Java Language Specification lista duas categorias: descontinuação e desmarcada.

As seções específicas em The Java Language Specification, onde são definidas, não são consistentes entre as versões. Na especificação do Java SE 8 uncheckede deprecationsão listados como avisos do compilador nas seções 9.6.4.5. @SuppressWarnings e 9.6.4.6 @ Deprecated , respectivamente.

Para o compilador da Sun, a execução javac -Xfornece uma lista de todos os valores reconhecidos por essa versão. Para 1.5.0_17, a lista parece ser:

  • tudo
  • depreciação
  • desmarcado
  • Cair em
  • caminho
  • serial
  • finalmente

43

A lista é específica do compilador. Mas aqui estão os valores suportados no Eclipse :

  • Reprovação de deprecação mesmo dentro de código reprovado
  • allJavadoc javadoc inválido ou ausente
  • assertIdentifier ocorrência de assert usada como identificador
  • conversão de caixa automática de boxe
  • charConcat quando uma matriz de caracteres é usada em uma concatenação de cadeias sem ser convertida explicitamente em uma cadeia
  • conditionAssign possível atribuição booleana acidental
  • método constructorName com nome do construtor
  • dep-ann em falta na anotação @Deprecated
  • depreciação uso de tipo preterido ou membro do lado de fora preterido código
  • uso desencorajado de tipos que correspondem a uma regra de acesso desencorajado
  • emptyBlock bloco vazio não documentado
  • enumSwitch , chave incompleta chave enum incompleta
  • fallthrough caso fallthrough possível
  • fieldHiding campo oculto outra variável
  • parâmetro do tipo finalBound com limite final
  • finalmente, finalmente, bloquear não concluir normalmente
  • uso proibido de tipos que correspondem a uma regra de acesso proibido
  • ocultando macro para fieldHiding, localHiding, typeHiding e maskedCatchBlock
  • indirStatic referência indireta ao membro estático
  • Tipo de anotação intfAnnotation usado como super interface
  • interface intfNonInherited compatibilidade de método não herdado
  • javadoc javadoc inválido
  • localHiding variável local ocultando outra variável
  • bloco de captura oculto maskedCatchBlocks
  • literais de string nls non-nls (falta de tags // $ NON-NLS-)
  • atribuição noEffectAssign sem efeito
  • potencial nulo ausente ou verificação nula redundante
  • nullDereference ausente na verificação nula
  • anotação @Override ausente de over-ann
  • paramAssign atribuir a um parâmetro
  • pkgDefaultMethod tenta substituir o método padrão do pacote
  • uso bruto a do tipo bruto (em vez de um tipo parametrizado)
  • ponto e vírgula ponto e vírgula desnecessário ou declaração vazia
  • serial ausente serialVersionUID
  • parâmetro construtor ou setter specialParamHiding ocultando outro campo
  • macro de acesso estático para indirStatic e staticReceiver
  • staticReceiver se um receptor não estático for usado para obter um campo estático ou chamar um método estático
  • Super substituir um método sem fazer um super invocação
  • suprimir ativar @SuppressWarnings
  • SyntheticAccess, acesso sintético ao executar o acesso sintético para a classe interna
  • As tarefas ativam o suporte para tags de tarefas no código-fonte
  • parâmetro typeHiding type ocultando outro tipo
  • operação do tipo não verificado
  • desnecessaryElse cláusula else desnecessária
  • unqualified-field-access, unqualifiedField referência não qualificada ao campo
  • macro não utilizada para unusedArgument, unusedImport, unusedLabel, unusedLocal, unusedPrivate e unusedThrown
  • unusedArgument argumento não utilizado do método
  • unusedImport referência de importação não utilizada
  • unusedLabel etiqueta não utilizada
  • unusedLocal variável local não utilizado
  • unusedPrivate declaração de membro privado não utilizados
  • exceção não declarada lançada não utilizada
  • uselessTypeCheck operação / conversão de instância desnecessária
  • varargsCast argumento varargs precisa de conversão explícita
  • warningToken não tratada advertência token no @SuppressWarnings

O Sun JDK (1.6) possui uma lista mais curta de avisos suportados:

  • reprovação Verifique o uso de itens depreciados.
  • desmarcado Forneça mais detalhes para avisos de conversão desmarcados que são exigidos pela Java Language Specification.
  • serial Avise sobre a falta de definições de serialVersionUID em classes serializáveis.
  • finalmente Avise sobre finalmente cláusulas que não podem ser concluídas normalmente.
  • passagem Verifique os blocos de chaves para ver se há casos de falha e forneça uma mensagem de aviso para os encontrados.
  • caminho Verifique se há um caminho inexistente nos caminhos do ambiente (como caminho de classe).

O mais recente javac disponível (1.6.0_13) para mac tem os seguintes avisos suportados

  • tudo
  • fundida
  • depreciação
  • divzero
  • vazio
  • desmarcado
  • Cair em
  • caminho
  • serial
  • finalmente
  • substituições

A lista do Eclipse aqui procura os sinalizadores do compilador e não as anotações do SuppressWarning (verifique a última parte do documento que você vinculou).
Ron Tuffin

3
Eles são ambos. Ao definir os sinalizadores do compilador, você diz ao compilador que tipo de avisos deseja. Com as anotações, você pode suprimir esses avisos em locais específicos do seu código.
1129 Wroblewski

Eu acho que a lista é mais curta para o Eclipse. Ver os últimos docs Galileo, lista de fichas disponíveis para SupressWarnings é explícito lá: help.eclipse.org/galileo/index.jsp?topic=/...
Peter Štibraný

2
Tentei @SuppressWarnings ("raw") no Eclipse 3.5 e ele não funciona - recebo um aviso de que "raw" não é um valor válido para esta anotação.
Jesper

eu também. Infelizmente, o suporte a jsp não é tão liberado quanto o suporte a java.
stu

9

Um novo favorito para mim está @SuppressWarnings("WeakerAccess")no IntelliJ, que evita queixas quando pensa que você deve ter um modificador de acesso mais fraco do que está usando. Temos que ter acesso público a alguns métodos para dar suporte ao teste, e a @VisibleForTestinganotação não impede os avisos.

ETA: "Anonymous" comentou, na página @MattCampbell vinculada a, a seguinte nota incrivelmente útil:

Você não precisa usar esta lista para o objetivo que está descrevendo. O IntelliJ adicionará esses SuppressWarnings automaticamente se você solicitar. Ele tem sido capaz de fazer isso por tantos lançamentos de volta quanto eu me lembro.

Vá para o local em que você recebe o aviso e digite Alt-Enter (ou selecione-o na lista Inspeções, se o estiver vendo lá). Quando o menu é exibido, mostrando o aviso e oferecendo a correção para você (por exemplo, se o aviso for "O método pode ser estático", "tornar estático" é a oferta da IntellJ para corrigi-lo), em vez de selecionar "enter", basta usar o botão de seta para a direita para acessar o submenu, que terá opções como "Editar configuração do perfil de inspeção" e assim por diante. No final desta lista, haverá opções como "Suprimir todas as inspeções da classe", "Suprimir da classe", "Suprimir do método" e, ocasionalmente, "Suprimir da instrução". Você provavelmente deseja que um desses apareça por último na lista. A seleção de uma delas adicionará uma anotação @SuppressWarnings (ou comentário em alguns casos) ao seu código, suprimindo o aviso em questão. Você não precisará adivinhar qual anotação adicionar, porque o IntelliJ escolherá com base no aviso que você selecionou.


2

Percebi que //noinspectionpode ser gerado automaticamente no IntelliJ

  • verifique se você ainda não possui um plano @SuppressWarninigsantes da declaração
  • Agora você pode gerar automaticamente o específico //noinspectionpressionando Alt + Enter quando o aviso estiver selecionado e, em seguida, use a tecla de seta para a direita para ver a opção Suprimir para ...

Acabei aqui quando eu queria suprimir um aviso de "switch tem muito poucos rótulos de caso" do IntelliJ. Não encontrei uma lista completa para o @SuppressWarningsuporte do IntelliJ, mas //noinspectionfiz o truque para mim.


Você também pode adicionar @SuppressWarnings ("SwitchStatementWithTooFewBranches").
JPM

Infelizmente, a opção Supress for ... ao clicar em ALT + ENTER nem sempre está disponível
flawyte

//noinspection SwitchStatementWithTooFewBranchesantes das switchobras também para mim.
Oliver Hausler

1

E esta parece ser uma lista muito mais completa, onde encontrei alguns avisos específicos para o Android-Studio que não encontrei em nenhum outro lugar (por exemplo, SynchronizeOnNonFinalField)

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

Ah, agora as diretrizes da SO contradizem as restrições da SO. Por um lado, devo copiar a lista em vez de fornecer apenas o link. Mas, por outro lado, isso excederia o número máximo permitido de caracteres. Então, vamos apenas torcer para que o link não seja quebrado.


1

JSL 1.7

A documentação do Oracle menciona:

  • unchecked: Os avisos não verificados são identificados pela sequência "não verificada".
  • deprecation: Um compilador Java deve produzir um aviso de reprovação quando um tipo, método, campo ou construtor cuja declaração é anotada com a anotação @Deprecated é usado (ou seja, substituído, invocado ou referenciado por nome), a menos que: [...] use está dentro de uma entidade anotada para suprimir o aviso com a anotação @SuppressWarnings ("descontinuação"); ou

Em seguida, explica que as implementações podem adicionar e documentar suas próprias:

Os fornecedores do compilador devem documentar os nomes de aviso que eles suportam em conjunto com esse tipo de anotação. Os fornecedores são incentivados a cooperar para garantir que os mesmos nomes funcionem em vários compiladores.


1
Não é verdade que esse uncheckedseja o único endossado pelo padrão; o muito próxima seção da que você citou diz avisos deprecation não deve ser produzido quando "O uso está dentro de uma entidade que é anotado para suprimir o aviso com a anotação @SuppressWarnings("deprecation")"
kbolino

1

Eu só quero acrescentar que há uma lista principal de parâmetros de supressão do IntelliJ em: https://gist.github.com/vegaasen/157fbc6dce8545b7f12c

Parece bastante abrangente. 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

1

Se você estiver usando o SonarLint, tente acima do método ou classifique toda a string do squid: @SuppressWarnings ("squid: S1172")

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.