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


265

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

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


3
Этот вопрос действительно хорош и ответы полезны. Если кто-то из JCP смотрит на это, вы должны понять, насколько беспорядочно добавить предупреждение подавления. Там нет соглашения о случае, дефис, случай верблюда, это просто беспорядок, было бы здорово стандартизировать это.
Сниколас

Я вижу "ProhibitedExceptionDeclared"в Eclipse Collections Framework ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction), и это не указано ниже.
Кевинарпе

Ответы:


251

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

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

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

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

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

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

  • ресурс для подавления предупреждений относительно использования ресурсов типа Closeable
  • переопределение синхронизации для подавления предупреждений из-за отсутствия синхронизации при переопределении синхронизированного метода

Кеплер и Луна используют тот же список токенов, что и Юнона ( список ).

Другие будут похожи, но различаются.


В каких случаях было бы полезно подавление нулевого предупреждения?
Джесси Яшинский

@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в этот момент не могут быть нулевыми
номинальная

2
@cletus: можно ли добавлять типы предупреждений в затмении? Проблема в том, что один из членов нашей команды использует IntelliJ, и что в IDE есть другие типы предупреждений-подавлений, которые выдают предупреждения в Eclipse :) В Eclipse Indigo вы можете установить в настройках: Игнорировать неиспользуемые токены SuppressWarnings, но это, похоже, не работает ...
KC

semicolonне похоже на работу в луне? :( Может кто-нибудь проверить, semicolonдействительно ли это действительно так?
Киссаки,

Какое значение имеет подавление предупреждения «синхронизация в неконечном поле»?
Маттео

48

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

В Учебниках 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 список выглядит так:

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

43

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

  • allDeprecation устарела даже внутри устаревшего кода
  • allJavadoc недействителен или отсутствует Javadoc
  • assertIdentifier вхождение assert используется в качестве идентификатора
  • конвертация бокса
  • charConcat, когда массив символов используется в конкатенации строк без явного преобразования в строку
  • условиеAssign возможно случайное логическое назначение
  • constructorName метод с именем конструктора
  • dep-ann отсутствует @ Устаревшая аннотация
  • устаревшее использование устаревшего типа или члена вне устаревшего кода
  • не рекомендуется использовать типы, соответствующие правилу нежелательного доступа
  • emptyBlock недокументированный пустой блок
  • enumSwitch , неполное переключение - неполное перечисление
  • проваливается возможно проваливается случай
  • fieldHiding поле скрывает другую переменную
  • Параметр типа finalBound с окончательной границей
  • наконец, наконец, блок не завершается нормально
  • запрещенное использование типов, соответствующих правилу запрещенного доступа
  • скрывающий макрос для fieldHiding, localHiding, typeHiding и maskedCatchBlock
  • косвенная ссылка на статический член
  • Тип аннотации intfAnnotation, используемый в качестве суперинтерфейса
  • intfNonInherited интерфейс не наследуемый метод совместимости
  • Javadoc недействительным Javadoc
  • localHiding локальная переменная скрывает другую переменную
  • maskedCatchBlocks скрытый блок catch
  • nls не-nls строковые литералы (без тегов // $ NON-NLS-)
  • noEffectAssign присваивание без эффекта
  • отсутствует нулевой потенциал или избыточная проверка нуля
  • nullDereference отсутствует проверка нуля
  • более поздняя отсутствует @Override аннотация
  • назначение paramAssign параметру
  • pkgDefaultMethod пытается переопределить метод пакета по умолчанию
  • необработанное использование необработанного типа (вместо параметризованного типа)
  • точка с запятой ненужная точка с запятой или пустое утверждение
  • серийный отсутствует serialVersionUID
  • specialParamHiding конструктор или параметр setter, скрывающий другое поле
  • макрос статического доступа дляirectStatic и staticReceiver
  • staticReceiver, если нестатический приемник используется для получения статического поля или вызова статического метода
  • супер переопределение метода без супер-вызова
  • подавить включение @SuppressWarnings
  • синтетический доступ, синтетический доступ при выполнении синтетического доступа для внутреннего класса
  • Задачи включают поддержку тегов задач в исходном коде
  • Параметр типа typeHiding скрывает другой тип
  • непроверенная непроверенная операция типа
  • ненужныйЕли ненужный еще пункт
  • unqualified-field-access, unqualifiedField неполная ссылка на поле
  • неиспользуемый макрос для unusedArgument, unusedImport, unusedLabel, unusedLocal, unusedPrivate и unusedThrown
  • unusedArgument неиспользуемый аргумент метода
  • unusedImport неиспользованная ссылка на импорт
  • unusedLabel неиспользованная этикетка
  • unusedLocal неиспользуемая локальная переменная
  • unusedPrivate неиспользованное объявление частного члена
  • unusedThrown неиспользованное объявленное исключение
  • uselessTypeCheck ненужные операции приведения / экземпляра
  • varargsCast Аргумент varargs требует явного приведения
  • warningToken необработанный токен предупреждения в @SuppressWarnings

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

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

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

  • все
  • бросать
  • неодобрение
  • divzero
  • опорожнить
  • непроверенный
  • Проваливаться
  • дорожка
  • последовательный
  • Ну наконец то
  • Переопределение

Список Eclipse здесь ищет флаги компилятора, а не аннотации SuppressWarning (проверьте последнюю часть документа, которую вы связали).
Рон Таффин

3
Они оба. Устанавливая флаги компилятора, вы сообщаете компилятору, какие предупреждения вы хотите. С помощью аннотаций вы можете подавить эти предупреждения в определенных местах вашего кода.
Д. Вроблевский,

Я думаю, что список для Eclipse короче. См. Последние документы по Галилео, список доступных токенов для SupressWarnings можно найти здесь: help.eclipse.org/galileo/index.jsp?topic=/…
Peter Štibraný

2
Я пробовал @SuppressWarnings («raw») в Eclipse 3.5, и он не работает - я получаю предупреждение, что «raw» не является допустимым значением для этой аннотации.
Джеспер

я тоже. К сожалению, поддержка jsp не так очищена, как поддержка java.
Stu

9

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

ETA: «Аноним» прокомментировал на странице, на которую ссылается @MattCampbell, следующую невероятно полезную заметку:

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

Просто перейдите в место, где у вас есть предупреждение и введите Alt-Enter (или выберите его в списке проверок, если вы видите его там). Когда появится меню с предупреждением и предложением исправить его для вас (например, если предупреждение «Метод может быть статичным», тогда «сделать статическим» - это предложение IntellJ исправить это для вас) вместо выбора «вводить», просто используйте кнопку со стрелкой вправо для доступа к подменю, которое будет иметь такие опции, как «Редактировать настройки инспекционного профиля» и так далее. Внизу этого списка будут такие параметры, как «Подавить все проверки для класса», «Подавить для класса», «Подавить для метода» и иногда «Подавить для утверждения». Вы, вероятно, хотите, чтобы один из них появился последним в списке. Выбор одного из них добавит аннотацию @SuppressWarnings (или комментарий в некоторых случаях) к вашему коду, подавляя соответствующее предупреждение. Вам не нужно будет угадывать, какую аннотацию добавить, потому что IntelliJ будет выбирать на основе выбранного предупреждения.


2

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

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

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


Вы также можете добавить @SuppressWarnings («SwitchStatementWithTooFewBranches») для этого.
JPM

К сожалению, опция Supress for ... при нажатии ALT + ENTER не всегда доступна
flawyte

//noinspection SwitchStatementWithTooFewBranchesдо switchработы, а также для меня.
Оливер Хауслер

1

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

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

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


1

JSL 1.7

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

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

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

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


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

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

Если вы используете SonarLint, попробуйте выше метод или класс всей строки squid: @SuppressWarnings ("squid: S1172")

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.