Ответы:
Первоначальный подход 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>
теги begin и end):
<FindBugsFilter>
<Match>
<Class name="com.mycompany.foo" />
<Method name="bar" />
<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
</Match>
</FindBugsFilter>
Если вы используете плагин Android Studio FindBugs, перейдите к файлу XML-фильтра, выбрав Файл-> Другие настройки-> Настройки по умолчанию-> Другие настройки-> НайтиBugs-IDEA-> Фильтр-> Исключить файлы фильтра-> Добавить.
Обновите 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 Spring Annotation
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 в вашем pom-файле - они только время компиляции, поэтому вы можете использовать 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") String s = null; Я думаю, что лучшее, что вы можете сделать, - это выделить код с предупреждением в наименьший возможный метод, а затем подавить предупреждение для всего метода.
java.lang.SuppressWarnings
не могу работать У него есть сохранение источника, поэтому он не виден багам.