С PMD, если вы хотите игнорировать конкретное предупреждение, вы можете использовать // NOPMD
, чтобы эта строка игнорировалась.
Есть что-то подобное для FindBugs?
С PMD, если вы хотите игнорировать конкретное предупреждение, вы можете использовать // NOPMD
, чтобы эта строка игнорировалась.
Есть что-то подобное для FindBugs?
Первоначальный подход FindBugs включает файлы конфигурации XML, также известные как фильтры. Это действительно менее удобно, чем решение PMD, но FindBugs работает с байт-кодом, а не с исходным кодом, поэтому комментарии, очевидно, не подходят. Пример:
<Match>
<Class name="com.mycompany.Foo" />
<Method name="bar" />
<Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL" />
</Match>
Однако для решения этой проблемы FindBugs позже представил другое решение, основанное на аннотациях (см. _ 2_), который можно использовать в классе или в на уровне метода (на мой взгляд, удобнее, чем 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
из-за конфликта имен с SuppressWarnings
в Java.
<dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
- person bramp; 16.12.2013
<dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>
в свой POM, если они хотят использовать @SuppressFBWarnings
.
- person jansohn; 13.08.2015
Как уже упоминалось, вы можете использовать аннотацию @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-файлу фильтра, используя File-> Other Settings-> Default Settings-> Other Settings-> FindBugs-IDEA-> Filter-> Exclude filter files-> Add.
Обновить Gradle
dependencies {
compile group: 'findbugs', name: 'findbugs', version: '1.0.0'
}
Найдите отчет о найденных ошибках
файл: ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html
Найдите конкретное сообщение
Импортируйте правильную версию аннотации
import edu.umd.cs.findbugs.annotations.SuppressWarnings;
Добавьте аннотацию непосредственно над ошибочным кодом
@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")
Дополнительную информацию см. Здесь: Spring Annotation findbugs а>
compile 'net.sourceforge.findbugs:annotations:1.3.2'
, который короче.
- person kosiara - Bartosz Kosarzycki; 11.10.2016
testCompile 'com.google.code.findbugs:annotations:3.0.0'
и имя аннотации @SuppressFBWarnings
- person Vlad.Bachurin; 26.05.2017
На момент написания этой статьи (май 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
. Однако сказанное выше яснее.
Затем вы добавляете аннотацию над своим методом:
E.g.
@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
не может работать. Он сохраняет исходный код, поэтому он не виден для поиска ошибок.
- person Philip Aston; 22.03.2016