Câu trả lời:
Cách tiếp cận ban đầu FindBugs liên quan đến các tệp cấu hình XML hay còn gọi là các bộ lọc . Điều này thực sự không thuận tiện hơn giải pháp PMD nhưng FindBugs hoạt động trên mã byte, không phải trên mã nguồn, vì vậy các bình luận rõ ràng không phải là một lựa chọn. Thí dụ:
<Match>
<Class name="com.mycompany.Foo" />
<Method name="bar" />
<Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL" />
</Match>
Tuy nhiên, để giải quyết vấn đề này, FindBugs sau đó đã giới thiệu một giải pháp khác dựa trên các chú thích (xem SuppressFBWarnings
) mà bạn có thể sử dụng ở lớp hoặc ở cấp phương thức (theo ý kiến của tôi thuận tiện hơn XML). Ví dụ (có thể không phải là ví dụ tốt nhất nhưng, vâng, đó chỉ là một ví dụ):
@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
value="HE_EQUALS_USE_HASHCODE",
justification="I know what I'm doing")
Lưu ý rằng vì FindBugs 3.0.0 SuppressWarnings
đã không được hỗ trợ @SuppressFBWarnings
vì xung đột tên với 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>
vào POM của họ nếu họ muốn sử dụng @SuppressFBWarnings
.
Như những người khác đã đề cập, bạn có thể sử dụng @SuppressFBWarnings
Chú thích. Nếu bạn không muốn hoặc không thể thêm Phụ thuộc khác vào mã của mình, bạn có thể tự thêm Chú thích vào Mã của mình, Findbugs không quan tâm đến Gói chú thích nào.
@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 "";
}
Nguồn: https://sourceforge.net/p/findbugs/feature-requests/298/#5e88
Dưới đây là một ví dụ đầy đủ hơn về bộ lọc XML (ví dụ ở trên sẽ không hoạt động vì nó chỉ hiển thị một đoạn mã và thiếu các <FindBugsFilter>
thẻ bắt đầu và kết thúc):
<FindBugsFilter>
<Match>
<Class name="com.mycompany.foo" />
<Method name="bar" />
<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
</Match>
</FindBugsFilter>
Nếu bạn đang sử dụng plugin FindBugs của Android Studio, hãy duyệt đến tệp bộ lọc XML của bạn bằng Tệp-> Cài đặt khác-> Cài đặt mặc định-> Cài đặt khác-> FindBugs-IDEA-> Bộ lọc-> Loại trừ tệp bộ lọc-> Thêm.
Cập nhật lớp
dependencies {
compile group: 'findbugs', name: 'findbugs', version: '1.0.0'
}
Xác định vị trí báo cáo FindBugs
tệp: ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html
Tìm thông điệp cụ thể
Nhập phiên bản chính xác của chú thích
import edu.umd.cs.findbugs.annotations.SuppressWarnings;
Thêm chú thích ngay phía trên mã vi phạm
@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")
Xem ở đây để biết thêm: findbugs Spring Annotation
compile 'net.sourceforge.findbugs:annotations:1.3.2'
cú pháp thay vì ngắn hơn.
testCompile 'com.google.code.findbugs:annotations:3.0.0'
và chú thích@SuppressFBWarnings
Tại thời điểm viết bài này (tháng 5 năm 2018), FindBugs dường như đã được thay thế bởi SpotBugs . Sử dụng SuppressFBWarnings
chú thích đòi hỏi mã của bạn phải được biên dịch bằng Java 8 trở lên và giới thiệu một phụ thuộc thời gian biên dịch vào spotbugs-annotations.jar
.
Sử dụng tệp bộ lọc để lọc quy tắc SpotBugs không có vấn đề như vậy. Các tài liệu ở đây .
Mặc dù các câu trả lời khác ở đây là hợp lệ, nhưng chúng không phải là một công thức đầy đủ để giải quyết vấn đề này.
Trên tinh thần hoàn thiện:
Bạn cần phải có các chú thích tìm kiếm trong tệp pom của mình - chúng chỉ biên dịch thời gian, vì vậy bạn có thể sử dụng provided
phạm vi:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>findbugs-annotations</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
Điều này cho phép sử dụng @SuppressFBWarnings
có một phụ thuộc khác cung cấp @SuppressWarnings
. Tuy nhiên, ở trên là rõ ràng hơn.
Sau đó, bạn thêm chú thích phía trên phương thức của bạn:
Ví dụ
@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))) { ... }
Điều này bao gồm cả tên của lỗi và cũng là lý do tại sao bạn vô hiệu hóa quá trình quét tìm nó.
Tôi sẽ để cái này ở đây: https://stackoverflow.com/a/14509697/1356953
Xin lưu ý rằng điều này hoạt động với java.lang.SuppressWarnings
vì vậy không cần phải sử dụng một chú thích riêng.
@SuppressWarnings trên một trường chỉ ngăn chặn các cảnh báo tìm kiếm được báo cáo cho khai báo trường đó, không phải mọi cảnh báo liên quan đến trường đó.
Ví dụ: điều này ngăn chặn cảnh báo "Trường chỉ được đặt thành null":
@SuppressWarnings ("UWF_NULL_FIELD") Chuỗi s = null; Tôi nghĩ điều tốt nhất bạn có thể làm là tách mã với cảnh báo thành phương thức nhỏ nhất bạn có thể, sau đó loại bỏ cảnh báo trên toàn bộ phương thức.
java.lang.SuppressWarnings
không thể làm việc Nó có khả năng duy trì nguồn, vì vậy không thể nhìn thấy đối với các findbugs.