Який список дійсних імен попередження @SuppressWarnings на Java?


264

Який список дійсних @SuppressWarningsімен попередження на Java?

Біт, який потрапляє між ("")в @SuppressWarnings("").


3
Це питання дуже приємне, і відповіді корисні. Якщо хтось із JCP дивиться на це, ви повинні усвідомити, наскільки брудно це додати попередження про придушення. Немає конвенції щодо випадку, дефісу, справи з верблюдами, це просто звичайний безлад, було б чудово це стандартизувати.
Snicolas

Я бачу "ProhibitedExceptionDeclared"в рамках Eclipse Collections Framework ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction), і це не вказано нижче.
kevinarpe

Відповіді:


250

Це залежить від вашого IDE або компілятора.

Ось список Eclipse Galileo:

  • все для придушення всіх попереджень
  • бокс для придушення попереджень щодо операцій боксу / розпакування
  • ролик для придушення попереджень щодо операцій лиття
  • dep-ann для придушення попереджень щодо застарілої анотації
  • депресія для придушення попереджень щодо застарілості
  • підсистема для придушення попереджень щодо відсутніх перерв у операторах переключення
  • нарешті, щоб придушити попередження щодо нарешті блокувати, які не повертаються
  • приховування, щоб придушити попередження щодо місцевих жителів, які приховують змінну
  • неповне перемикання для придушення попереджень щодо відсутніх записів у операторі перемикача (enum case)
  • nls для придушення попереджень відносно не-nls рядкових літералів
  • null для придушення попереджень щодо нульового аналізу
  • обмеження для придушення попереджень щодо використання обмежених або заборонених посилань
  • serial для придушення попереджень щодо відсутнього поля serialVersionUID для класу, що серіалізується
  • статичний доступ для придушення попереджень щодо неправильного статичного доступу
  • синтетичний доступ для придушення попереджень щодо неоптимізованого доступу з внутрішніх класів
  • невірно встановлено, щоб придушити попередження щодо неперевірених операцій
  • некваліфікований доступ до поля для придушення попереджень щодо доступу до поля, некваліфікований
  • невикористаний для придушення попереджень щодо невикористаного коду

Список для Indigo додає:

  • javadoc для придушення попереджень щодо попереджень javadoc
  • вихідні типи для придушення попереджень щодо використання сировинних типів
  • статичний метод придушення попереджень щодо методів, які можуть бути оголошені статичними
  • супер для придушення попереджень відносно методу, що перекриває, без супер викликів

Список для Юнони додає:

  • ресурс для придушення попереджень щодо використання ресурсів типу Closeable
  • sync-override для придушення попереджень через відсутність синхронізації при перезаписі синхронізованого методу

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

Інші будуть подібними, але різняться.


У яких випадках корисне придушення нульового попередження?
Джессі Яшинський

@Jesse: Коли компілятор помиляється (тобто "попередження" Stupid Flanders "). Спробуйте скомпілювати: void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }. Деякі середовища (наприклад, NetBeans 7.3 w / 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

Усі значення дозволені (нерозпізнані ігноруються). Список розпізнаних залежить від компілятора.

В The Java Tutorials 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 виникнення assrt, що використовується в якості ідентифікатора
  • бокс перетворення автобоксу
  • charConcat, коли масив char використовується в конкатенації рядків без явного перетворення в рядок
  • conditionAssign можливе випадкове булеве призначення
  • constructorName метод з ім'ям конструктора
  • dep-ann відсутня @ Зазначена анотація
  • Застаріле використання застарілого типу або члена поза засуджується код
  • не рекомендується використовувати типи, що відповідають правилам доступу
  • emptyBlock недокументований порожній блок
  • enumSwitch , неповний перемикання неповний перемикач перерахунку
  • можливий прохідний випадок
  • fieldHiding field приховує іншу змінну
  • параметр типу finalBound з кінцевим обмеженням
  • нарешті, блок остаточно не завершується
  • заборонене використання типів, що відповідають забороненому правилу доступу
  • приховування макросу для поля Приховання, локальне приховування, типЗаховання та маскуванняCatchBlock
  • indirectStatic непряме посилання на статичний член
  • Тип анотації intfAnnotation, що використовується як супер інтерфейс
  • Сумісність методу intfNonInherited, який не передається у спадок
  • javadoc недійсний javadoc
  • localHiding локальна змінна, що приховує іншу змінну
  • Блок прихованих уловок maskedCatchBlocks
  • nls non-nls рядкові літерали (відсутність тегів // $ NON-NLS-)
  • призначення noEffectAssign без ефекту
  • нульовий потенціал відсутній або надлишковий
  • nullDereference відсутня нульова перевірка
  • надмірна річ відсутня анотація @Override
  • Призначення paramAssign параметру
  • pkgDefaultMethod намагається замінити метод пакетів за замовчуванням
  • необроблене використання a необробленого типу (замість параметризованого типу)
  • крапка з комою непотрібна крапка з комою або порожній вислів
  • serial відсутній serialVersionUID
  • specialParamHiding конструктор або параметр setter, що приховує інше поле
  • макрос статичного доступу для indirectStatic та staticReceiver
  • staticReceiver, якщо нестатичний приймач використовується для отримання статичного поля або виклику статичного методу
  • супер перекручуючий метод, не роблячи супер-виклик
  • придушити увімкнути @SuppressWarnings
  • синтетичний доступ, синтетичний доступ при виконанні синтетичного доступу для внутрішнього класу
  • Завдання дозволяють підтримувати теги завдань у вихідному коді
  • typeHide параметр типу приховує інший тип
  • неперевірена операція без перевіреного типу
  • extraElse зайве інше застереження
  • некваліфіковане поле для доступу, некваліфіковане поле, некваліфіковане посилання на поле
  • невикористаний макрос unusedArgument, unusedImport, unusedLabel, unusedLocal, unusedPrivate та unusedThrown
  • аргумент unusedArgument unused method
  • unusedImport невикористану посилання на імпорт
  • unusedLabel невикористана мітка
  • unusedLocal невикористана локальна змінна
  • unusedPrivate невикористану декларацію приватного члена
  • unusedThrown невикористаний оголошений викинутий виняток
  • uselessTypeCheck непотрібні касти / екземпляри операції
  • varargsCast аргумент varargs потребує явного виступу
  • папярэджанняЗайнято необроблений маркер попередження в @SuppressWarnings

Sun JDK (1.6) має коротший список підтримуваних попереджень:

  • анулювання Перевірка на використання предметів, що амортизуються.
  • невірно Укажіть більше деталей щодо неперевірених попереджень про перетворення, які передбачені специфікацією мови Java.
  • serial Попередження про відсутні дефініції serialVersionUID на класах, що серіалізуються.
  • нарешті попередити про остаточні пропозиції, які не можуть нормально виконати.
  • Перевірте Перевірте блоки комутаторів на випадкові випадки, що містяться, і надішліть попереджувальне повідомлення для будь-яких знайдених.
  • path Перевірте наявність неіснуючих шляхів у контурах середовища (наприклад, classpath).

Останні доступні javac (1.6.0_13) для mac мають такі підтримувані попередження

  • всі
  • акторський склад
  • депресія
  • divzero
  • порожній
  • неперевірений
  • провалюватися
  • шлях
  • серійний
  • нарешті
  • перевизначає

У списку Eclipse тут розміщені прапори компілятора, а не анотації SuppressWarning (перевірте останню частину документа, який ви пов’язали).
Рон Туффін

3
Вони обоє. Встановлюючи прапори компілятора, ви повідомляєте компілятору, які застереження ви хочете. За допомогою приміток ви можете придушити ці попередження в певних місцях вашого коду.
D. Wroblewski

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

2
Я спробував @SuppressWarnings ("raw") в Eclipse 3.5, і він не працює - отримую попередження, що "raw" не є дійсним значенням для цієї анотації.
Jesper

я також. На жаль, підтримка jsp не настільки розмита, як підтримка Java.
Ст

9

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

ETA: "Anonymous" прокоментував на сторінці @MattCampbell, пов’язану із цим, неймовірно корисну примітку:

Вам не потрібно використовувати цей список з метою, яку ви описуєте. IntelliJ автоматично додасть вам ці SuppressWarnings, якщо ви попросите їх. Це було здатне зробити це стільки релізів, скільки я пам’ятаю.

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


2

Я помітив, що //noinspectionв IntelliJ можна генерувати автоматично

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

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


Ви також можете додати @SuppressWarnings ("SwitchStatementWithTooFewBranches") також для цього.
JPM

На жаль, опція Supress for ... при натисканні
клавіші

//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 (тобто переопределена, викликана або посилається на ім'я), якщо: [...] використання використовується в межах сутності, яка коментується для придушення попередження за допомогою примітки @SuppressWarnings ("депресія"); або

Потім пояснюється, що реалізація може додавати та документувати власні:

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


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, спробуйте над методом або класифікуйте всю рядок кальмарів: @SuppressWarnings ("squid: S1172")

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.