Відповіді:
Первинний підхід FindBugs включає файли конфігурації XML, відомі як фільтри . Це дійсно менш зручно, ніж рішення PMD, але FindBugs працює на байт-коді, а не на вихідному коді, тому коментарі, очевидно, не є варіантом. Приклад:
<Match>
<Class name="com.mycompany.Foo" />
<Method name="bar" />
<Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL" />
</Match>
Однак, щоб вирішити цю проблему, FindBugs пізніше представив ще одне рішення на основі анотацій (див. SuppressFBWarnings
) , Яке ви можете використовувати на уроці або на рівні методу (на мою думку зручніше, ніж XML). Приклад (можливо, не найкращий, але, ну, це просто приклад):
@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
value="HE_EQUALS_USE_HASHCODE",
justification="I know what I'm doing")
Зауважте, що оскільки FindBugs 3.0.0 SuppressWarnings
був застарілим на користь @SuppressFBWarnings
через зіткнення імені з Java SuppressWarnings
.
<dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
<dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>
до своєї POM, якщо вони хочуть використовувати @SuppressFBWarnings
.
Як згадували інші, ви можете використовувати @SuppressFBWarnings
Анотацію. Якщо ви не хочете або не можете додати інший залежність до свого коду, ви можете самостійно додати анотацію до свого коду, Findbugs не хвилює, у якому пакунку знаходиться анотація.
@Retention(RetentionPolicy.CLASS)
public @interface SuppressFBWarnings {
/**
* The set of FindBugs warnings that are to be suppressed in
* annotated element. The value can be a bug category, kind or pattern.
*
*/
String[] value() default {};
/**
* Optional documentation of the reason why the warning is suppressed
*/
String justification() default "";
}
Джерело: https://sourceforge.net/p/findbugs/feature-requests/298/#5e88
Ось більш повний приклад XML-фільтра (приклад, наведений вище, сам по собі не працюватиме, оскільки він просто показує фрагмент і не містить <FindBugsFilter>
тегів початку та кінця):
<FindBugsFilter>
<Match>
<Class name="com.mycompany.foo" />
<Method name="bar" />
<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
</Match>
</FindBugsFilter>
Якщо ви використовуєте плагін Android Studio FindBugs, перейдіть до файлу фільтрів XML, використовуючи Файл-> Інші налаштування-> Налаштування за замовчуванням-> Інші налаштування-> FindBugs-IDEA-> Filter-> Виключити файли фільтрів-> Додати.
Оновити Gradle
dependencies {
compile group: 'findbugs', name: 'findbugs', version: '1.0.0'
}
Знайдіть звіт FindBugs
файл: ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html
Знайдіть конкретне повідомлення
Імпортуйте правильну версію примітки
import edu.umd.cs.findbugs.annotations.SuppressWarnings;
Додайте примітку безпосередньо над кодом-порушником
@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")
Дивіться тут для отримання додаткової інформації: findbugs Весняна анотація
compile 'net.sourceforge.findbugs:annotations:1.3.2'
синтаксис, який коротший.
testCompile 'com.google.code.findbugs:annotations:3.0.0'
та ім'я анотації@SuppressFBWarnings
На момент написання цього повідомлення (травень 2018 року), схоже, FindBugs був замінений SpotBugs . Використання SuppressFBWarnings
примітки вимагає, щоб ваш код був скомпільований з Java 8 або пізнішої версії та вводив залежність часу компіляції від spotbugs-annotations.jar
.
Використання файлу фільтра для фільтрації правил SpotBugs не має таких проблем. Документація тут .
Хоча інші відповіді тут справедливі, вони не є повним рецептом для вирішення цього питання.
У дусі повноти:
У вашому пом-файлі потрібно мати анотації findbugs - вони лише час компіляції, щоб ви могли використовувати provided
область:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>findbugs-annotations</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
Це дозволяє використовувати @SuppressFBWarnings
ще одну залежність, яка забезпечує @SuppressWarnings
. Однак вищесказане зрозуміліше.
Потім ви додаєте примітку вище свого методу:
Напр
@SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE",
justification = "Scanning generated code of try-with-resources")
@Override
public String get() {
try (InputStream resourceStream = owningType.getClassLoader().getResourceAsStream(resourcePath);
BufferedReader reader = new BufferedReader(new InputStreamReader(resourceStream, UTF_8))) { ... }
Це включає як ім'я помилки, так і причину, чому ви відключаєте сканування на неї.
Я збираюся залишити цю тут: https://stackoverflow.com/a/14509697/1356953
Зауважте, що це працює, java.lang.SuppressWarnings
тому не потрібно використовувати окрему анотацію.
@SuppressWarnings на полі придушує лише попередження findbugs, повідомлені для цього декларації поля, а не кожне попередження, пов’язане з цим полем.
Наприклад, це пригнічує попередження "Поле лише коли-небудь встановлене на нуль":
@SuppressWarnings ("UWF_NULL_FIELD") Рядок s = null; Я думаю, що найкраще, що ви можете зробити, це виділити код з попередженням в найменший спосіб, який ви можете, а потім придушити попередження щодо всього методу.
java.lang.SuppressWarnings
не може працювати. Він має збереження джерела, тому його не видно для пошуку помилок.