답변:
FindBugs의 초기 접근 방식은 필터 인 XML 구성 파일을 포함 합니다 . 이것은 PMD 솔루션보다 편리하지 않지만 FindBugs는 소스 코드가 아닌 바이트 코드에서 작동하므로 주석은 분명히 옵션이 아닙니다. 예:
<Match>
<Class name="com.mycompany.Foo" />
<Method name="bar" />
<Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL" />
</Match>
그러나이 문제를 해결하기 위해 FindBugs는 나중에 클래스 또는 메소드 수준 (내 의견으로는 XML보다 편리함)에서 사용할 수있는 주석을 기반으로 한 다른 솔루션을 소개했습니다 (참조 SuppressFBWarnings
). 예 (가장 좋은 것은 아니지만 예일뿐입니다) :
@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
value="HE_EQUALS_USE_HASHCODE",
justification="I know what I'm doing")
Java와의 이름 충돌로 인해 FindBugs 3.0.0 SuppressWarnings
이 더 이상 사용되지 않습니다 .@SuppressFBWarnings
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 플러그인을 사용하는 경우 파일-> 기타 설정-> 기본 설정-> 기타 설정-> FindBugs-IDEA-> 필터-> 필터 파일 제외-> 추가를 사용하여 XML 필터 파일을 찾으십시오.
Gradle 업데이트
dependencies {
compile group: 'findbugs', name: 'findbugs', version: '1.0.0'
}
FindBugs 보고서를 찾습니다
file : ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html
특정 메시지 찾기
올바른 버전의 주석을 가져옵니다.
import edu.umd.cs.findbugs.annotations.SuppressWarnings;
문제 코드 바로 위에 주석 추가
@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")
자세한 정보는 here : findbugs Spring Annotation
compile 'net.sourceforge.findbugs:annotations:1.3.2'
더 짧은 구문을 대신 사용할 수 있습니다 .
testCompile 'com.google.code.findbugs:annotations:3.0.0'
및 주석의 이름을@SuppressFBWarnings
이 글을 쓰는 시점 (2018 년 5 월), FindBugs는 SpotBugs 로 대체 된 것으로 보입니다 . SuppressFBWarnings
주석을 사용 하려면 코드를 Java 8 이상으로 컴파일해야하고에 컴파일 시간 종속성이 있어야합니다 spotbugs-annotations.jar
.
필터 파일을 사용하여 SpotBugs 규칙을 필터링하는 것은 그러한 문제가 없습니다. 설명서는 여기에 있습니다 .
여기에 다른 답변이 유효하지만이를 해결하기위한 완벽한 조리법은 아닙니다.
완전성의 정신에서 :
pom 파일에 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 : //.com/a/14509697/1356953
이 기능은 작동 java.lang.SuppressWarnings
하므로 별도의 주석을 사용할 필요가 없습니다.
필드의 @SuppressWarnings는 해당 필드와 관련된 모든 경고가 아니라 해당 필드 선언에 대해보고 된 findbugs 경고 만 억제합니다.
예를 들어 "필드 만 null로 설정"경고가 표시되지 않습니다.
@SuppressWarnings ( "UWF_NULL_FIELD") 문자열 s = null; 나는 당신이 할 수있는 최선의 방법은 경고가있는 코드를 가능한 가장 작은 방법으로 분리 한 다음 전체 방법의 경고를 억제하는 것입니다.
java.lang.SuppressWarnings
작동하지 않습니다. 소스 보존이 있으므로 찾기 버그에는 보이지 않습니다.