Odpowiedzi:
Początkowe podejście FindBugs obejmuje pliki konfiguracyjne XML, czyli filtry . Jest to naprawdę mniej wygodne niż rozwiązanie PMD, ale FindBugs działa na kodzie bajtowym, a nie na kodzie źródłowym, więc komentarze oczywiście nie są opcją. Przykład:
<Match>
<Class name="com.mycompany.Foo" />
<Method name="bar" />
<Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL" />
</Match>
Jednak, aby rozwiązać ten problem, FindBugs wprowadził później inne rozwiązanie oparte na adnotacjach (patrz SuppressFBWarnings
), które można wykorzystać na poziomie klasy lub metody (moim zdaniem wygodniejsze niż XML). Przykład (może nie najlepszy, ale cóż, to tylko przykład):
@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
value="HE_EQUALS_USE_HASHCODE",
justification="I know what I'm doing")
Zauważ, że odkąd FindBugs 3.0.0 SuppressWarnings
został wycofany na korzyść z @SuppressFBWarnings
powodu konfliktu nazw z Javą 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>
do swojej POM, jeśli chcą skorzystać @SuppressFBWarnings
.
Jak inni wspomnieli, możesz użyć @SuppressFBWarnings
Adnotacji. Jeśli nie chcesz lub nie możesz dodać innej zależności do swojego kodu, możesz sam dodać adnotację do swojego kodu, Findbugs nie ma znaczenia, w której paczce jest adnotacja.
@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 "";
}
Źródło: https://sourceforge.net/p/findbugs/feature-requests/298/#5e88
Oto bardziej kompletny przykład filtra XML (powyższy przykład sam w sobie nie będzie działał, ponieważ pokazuje tylko fragment kodu i brakuje <FindBugsFilter>
tagów początkowego i końcowego):
<FindBugsFilter>
<Match>
<Class name="com.mycompany.foo" />
<Method name="bar" />
<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
</Match>
</FindBugsFilter>
Jeśli korzystasz z wtyczki FindBugs dla Androida Studio, przejdź do pliku filtru XML, używając Plik-> Inne ustawienia-> Ustawienia domyślne-> Inne ustawienia-> FindBugs-IDEA-> Filtr-> Wyklucz pliki filtrów-> Dodaj.
Zaktualizuj Gradle
dependencies {
compile group: 'findbugs', name: 'findbugs', version: '1.0.0'
}
Znajdź raport FindBugs
plik: ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html
Znajdź konkretną wiadomość
Zaimportuj poprawną wersję adnotacji
import edu.umd.cs.findbugs.annotations.SuppressWarnings;
Dodaj adnotację bezpośrednio nad obraźliwym kodem
@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")
Zobacz tutaj, aby uzyskać więcej informacji: findbugs Spring Adnotation
compile 'net.sourceforge.findbugs:annotations:1.3.2'
składni, która jest krótsza.
testCompile 'com.google.code.findbugs:annotations:3.0.0'
i adnotacji@SuppressFBWarnings
W chwili pisania tego tekstu (maj 2018) FindBugs wydaje się być zastąpiony przez SpotBugs . Korzystanie z SuppressFBWarnings
adnotacji wymaga kompilacji kodu w Javie 8 lub nowszej i wprowadza zależność od czasu kompilacji spotbugs-annotations.jar
.
Używanie pliku filtru do filtrowania reguł SpotBugs nie ma takich problemów. Dokumentacja jest tutaj .
Chociaż inne odpowiedzi tutaj są prawidłowe, nie są one pełnym przepisem na rozwiązanie tego problemu.
W duchu kompletności:
Musisz mieć adnotacje findbugs w pliku pom - to tylko czas kompilacji, więc możesz użyć provided
zakresu:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>findbugs-annotations</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
Pozwala to na użycie @SuppressFBWarnings
innej zależności, która zapewnia @SuppressWarnings
. Powyższe jest jednak jaśniejsze.
Następnie dodajesz adnotację nad metodą:
Na przykład
@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))) { ... }
Obejmuje to zarówno nazwę błędu, jak i powód wyłączenia skanowania.
Zostawię to tutaj: https://stackoverflow.com/a/14509697/1356953
Pamiętaj, że działa java.lang.SuppressWarnings
to bez potrzeby używania osobnej adnotacji.
@SuppressWarnings na polu pomija tylko ostrzeżenia findbugs zgłoszone dla tej deklaracji pola, nie każde ostrzeżenie związane z tym polem.
Na przykład, pomija to ostrzeżenie „Pole zawsze ustawione na zero”:
@SuppressWarnings („UWF_NULL_FIELD”) String s = null; Myślę, że najlepsze, co możesz zrobić, to wyizolować kod z ostrzeżeniem na najmniejszą możliwą metodę, a następnie ukryć ostrzeżenie dla całej metody.
java.lang.SuppressWarnings
nie mogę pracować Ma zachowanie źródła, więc nie jest widoczny dla findbugs.