Каков список допустимых имен предупреждений @SuppressWarnings в Java?

234

Каков список допустимых имен @SuppressWarnings предупреждений в Java?

Бит, который находится между ("") в @SuppressWarnings("").

  • 2
    Этот вопрос действительно хорош и ответы полезны. Если кто-то из JCP смотрит на это, вы должны понять, насколько беспорядочно добавить предупреждение подавления. Там нет соглашения о случае, дефис, случай верблюда, это просто беспорядок, было бы здорово стандартизировать это.
  • 0
    Я вижу "ProhibitedExceptionDeclared" в Eclipse Collections Framework ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction ), и это не указано ниже.
Теги:
warnings
compiler-warnings
suppress-warnings

8 ответов

218
Лучший ответ

Это зависит от вашей IDE или компилятора.

Вот список для Eclipse Galileo:

  • все, чтобы пресечь все предупреждения
  • бокс, чтобы подавить предупреждения относительно операций бокса/распаковки.
  • лить, чтобы подавить предупреждения относительно операций с литой.
  • dep-ann для подавления предупреждений относительно устаревшей аннотации
  • обесценение для подавления предупреждений относительно устаревания
  • прохождение для подавления предупреждений относительно отсутствующих перерывов в коммутаторе заявления
  • наконец для подавления предупреждений относительно блока finally вернуться
  • скрывать, чтобы пресекать предупреждения относительно локалей, которые скрывают переменную
  • неполный-переключатель для подавления предупреждений относительно отсутствующих записей в операторе switch (регистр перечисления)
  • nls, чтобы подавить предупреждения относительно строковых литералов, отличных от nls
  • null для подавления предупреждений относительно нулевого анализа
  • ограничение, чтобы подавить предупреждения относительно использования обескураженных или запрещенные ссылки
  • серийный, чтобы подавить предупреждения относительно отсутствующих serialVersionUID поле для сериализуемого класса
  • static-access, чтобы подавить предупреждения относительно неправильного статического доступ
  • синтетический доступ для подавления предупреждений относительно неоптимизированного доступ из внутренних классов
  • не отмечен, чтобы подавить предупреждения относительно непроверенных операций
  • неквалифицированный доступ к полям для подавления предупреждений относительно поля доступ к неквалифицированным
  • не используется, чтобы пресекать предупреждения относительно неиспользуемого кода

Список для индиго добавляет:

  • javadoc для подавления предупреждений относительно предупреждений javadoc
  • rawtypes, чтобы подавить предупреждения относительно использования необработанных типов
  • static-method, чтобы подавить предупреждения относительно методов, которые могут быть объявлены как статические
  • super для подавления предупреждений относительно переопределения метода без супер-вызовов

Список для Juno добавляет:

  • ресурс, чтобы подавить предупреждения относительно использования ресурсов типа Closeable
  • sync-override для предотвращения предупреждений из-за отсутствия синхронизации при переопределении синхронизированного метода

Kepler и Luna используют тот же список токенов, что и Juno (список).

Другие будут похожи, но меняются.

  • 0
    В каких случаях было бы полезно подавление нулевого предупреждения?
  • 0
    @Jesse: Когда компилятор не прав (например, «Предупреждение о глупой Фландрии»). Попробуйте скомпилировать: void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); } Некоторые среды (например, NetBeans 7.3 с Java 6 JDK [1.6.0_41]) будут генерировать "o possibly null" o.toString() "o possibly null" при o.toString() даже если o не может быть нулевым в этой точке.
Показать ещё 3 комментария
45

Разрешены все значения (нераспознанные игнорируются). Список признанных является специфичным для компилятора.

В Учебники Java unchecked и deprecation перечислены в качестве двух предупреждений, требуемых Спецификацией языка Java, поэтому они должны допустимо со всеми компиляторами:

Каждое предупреждение компилятора относится к категории. Спецификация языка Java содержит две категории: устаревшие и непроверенные.

Конкретные разделы внутри Спецификация языка Java, где они определены, несовместимы между версиями. В спецификации Java SE 8 unchecked и deprecation перечислены как предупреждения компилятора в разделах 9.6.4.5. @SuppressWarnings и 9.6.4.6 @Deprecated, соответственно.

Для компилятора Sun, запуск javac -X дает список всех значений, распознаваемых этой версией. Для 1.5.0_17 список выглядит следующим образом:

  • все
  • устаревания
  • бесконтрольно
  • проваливаемся
  • путь
  • Последовательный
  • наконец,
35

Список специфичен для компилятора. Но вот значения, поддерживаемые в Eclipse:

  • allDeprecation обесценивание даже внутри устаревшего кода
  • allJavadoc недействительный или отсутствующий javadoc
  • assertIdentifier появление assert используется как идентификатор
  • бокс преобразование autoboxing
  • charConcat, когда массив char используется в конкатенации строк без прямого преобразования в строку
  • conditionAssign возможное случайное логическое назначение
  • метод constructorName с имя конструктора
  • dep-ann отсутствует @Deprecated аннотация
  • устаревшее использование устаревшего типа или члена вне устаревшего кода
  • обескуражено использование типов, соответствующих запрещенному правилу доступа
  • emptyBlock недокументированный пустой блок
  • enumSwitch, неполный переключатель неполный переключатель перечисления
  • прохождение возможного сквозного случая
  • fieldHiding поле, скрывающее другую переменную
  • finalBound с конечной границей
  • наконец, наконец, блокировка не выполняется нормально
  • запрещено использование типов, соответствующих запрещенному правилу доступа
  • скрытие макроса для fieldHiding, localHiding, typeHiding и maskedCatchBlock
  • косвенная косвенная ссылка на статический член
  • intfAnnotation тип аннотации, используемый в качестве суперинтерфейса
  • intfNonInherited совместимость интерфейса с не унаследованным интерфейсом
  • javadoc недействительный javadoc
  • localHiding локальная переменная, скрывающая другую переменную
  • maskedCatchBlocks скрытый блок catch
  • nls не-nls строковые литералы (отсутствие тегов // $NON-NLS-)
  • noEffectAssign назначение без эффекта
  • null Отсутствует или отсутствует нулевая проверка.
  • nullDereference отсутствует проверка null
  • over-ann отсутствует аннотация @Override
  • paramAssign присвоение параметру
  • pkgDefaultMethod попытка переопределить метод по умолчанию
  • raw использование типа raw (вместо параметризованного типа)
  • точка с запятой ненужная точка с запятой или пустой оператор
  • серийный отсутствует serialVersionUID
  • specialParamHiding конструктор или параметр setter скрывает другое поле
  • макрос static-access для косвенных и staticReceiver
  • staticReceiver, если нестатический приемник используется для получения статического поля или вызова статического метода
  • super переопределение метода без создания супер-вызова
  • подавить включить @SuppressWarnings
  • синтетический доступ, синтетический доступ при синтетическом доступе для внутреннего класса
  • задачи включить поддержку тегов задач в исходном коде
  • typeHiding параметр типа скрывает другой тип
  • непроверенная операция без отметки типа
  • ненужноеElse необязательное предложение else
  • unqualified-field-access, unqualifiedField неквалифицированный ссылка на поле
  • не использовался макрос для unusedArgument, unusedImport, unusedLabel, unusedLocal, unusedPrivate и unusedThrown
  • unusedArgument неиспользуемый аргумент метода
  • unusedImport неиспользованный импорт ссылка
  • не использовалсяLabel неиспользованная метка
  • unusedLocal неиспользуемая локальная переменная
  • unusedPrivate неиспользуемая декларация частного участника
  • unusedThrownнеиспользуемое объявленное исключение исключений
  • uselessTypeCheck ненужная операция cast/instanceof
  • varargsCast аргумент varargs нуждается в явном приведении
  • warningToken необработанный токен предупреждения в @SuppressWarnings

Sun JDK (1.6) имеет более короткий список поддерживаемых предупреждений:

  • устаревшее Проверить использование устаревших элементов.
  • unchecked. Дайте более подробную информацию о непроверенных предупреждениях о конверсиях, которые заданы спецификацией Java Language Specification.
  • serial Предупреждать о отсутствующих определениях serialVersionUID для сериализуемых классов.
  • наконец Предупреждать о предложениях, которые обычно не могут выполняться.
  • прохождение. Проверьте блоки блокировки для откатных случаев и предоставьте предупреждение для всех найденных.
  • путь Проверьте несуществующий путь в пути к среде (например, путь к классам).

Последний доступный javac (1.6.0_13) для mac имеет следующие поддерживаемые предупреждения

  • все
  • литье
  • устаревшее
  • divzero
  • пустой
  • не отмечен
  • прохождение
  • путь
  • серийный
  • наконец
  • переопределяет
  • 0
    Список Eclipse здесь ищет флаги компилятора, а не аннотации SuppressWarning (проверьте последнюю часть документа, которую вы связали).
  • 3
    Они оба. Устанавливая флаги компилятора, вы сообщаете компилятору, какие предупреждения вы хотите. С помощью аннотаций вы можете подавить эти предупреждения в определенных местах вашего кода.
Показать ещё 4 комментария
5

Новый фаворит для меня - @SuppressWarnings("WeakerAccess") в IntelliJ, который не дает жаловаться, когда он считает, что у вас должен быть более слабый модификатор доступа, чем вы используете. У нас должен быть публичный доступ к некоторым методам поддержки тестирования, а аннотация @VisibleForTesting не предотвращает предупреждения.

1

Я просто хочу добавить, что есть главный список параметров подавления IntelliJ по адресу: https://gist.github.com/vegaasen/157fbc6dce8545b7f12c

Он выглядит довольно всеобъемлющим. Частичное:

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

JSL 1.7

Документация Oracle упоминает:

  • unchecked: Непроверенные предупреждения идентифицируются строкой "unchecked".
  • deprecation: Java-компилятор должен выдать предупреждение об устаревании, когда используется тип, метод, поле или конструктор, чье объявление аннотируется аннотацией @Deprecated (т.е. переопределено, вызывается или ссылается по имени), если: [...] Использование находится внутри объекта, который аннотируется для подавления предупреждения с помощью аннотации @SuppressWarnings ( "устаревание" ); или

Затем он объясняет, что реализации могут добавлять и документировать свои собственные:

Поставщики компилятора должны документировать имена предупреждений, которые они поддерживают, в сочетании с этим типом аннотации. Поставщикам рекомендуется сотрудничать, чтобы гарантировать, что одни и те же имена работают с несколькими компиляторами.

  • 1
    Неверно, что unchecked является единственным, одобренным стандартом; в самом следующем разделе из того, который вы цитировали, говорится, что предупреждения об устаревании не должны создаваться, когда «Использование находится внутри объекта, который аннотирован для подавления предупреждения с помощью аннотации @SuppressWarnings("deprecation") »
  • 0
    @kbolino спасибо.
1

И это, кажется, намного более полный список, где я нашел некоторые предупреждения, специфичные для Android-Studio, которые я не мог найти в другом месте (например, SynchronizeOnNonFinalField)

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

О, теперь правила SO противоречат ограничениям SO. С одной стороны, я должен скопировать список, а не только ссылку. Но, с другой стороны, это превысит максимально допустимое количество символов. Поэтому давайте просто надеемся, что ссылка не сломается.

0

Я заметил, что //noinspection может быть автоматически сгенерирован в IntelliJ

  • убедитесь, что у вас еще нет плана @SuppressWarninigs до утверждения
  • Теперь вы можете автоматически сгенерировать определенный //noinspection, нажав Alt + Enter, когда у вас выбрано предупреждение, а затем используйте клавишу со стрелкой вправо, чтобы увидеть опцию Suppress for...

Закончился здесь, когда я хотел подавить предупреждение "Переключатель имеет слишком мало меток регистра" от IntelliJ. Я не нашел полный список поддержки IntelliJ @SuppressWarning но //noinspection мне.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню