ด้วย PMD หากคุณต้องการเพิกเฉยต่อคำเตือนคุณสามารถใช้// NOPMD
เพื่อให้บรรทัดนั้นถูกละเว้น
FindBugs มีลักษณะคล้ายกันหรือไม่
ด้วย PMD หากคุณต้องการเพิกเฉยต่อคำเตือนคุณสามารถใช้// NOPMD
เพื่อให้บรรทัดนั้นถูกละเว้น
FindBugs มีลักษณะคล้ายกันหรือไม่
คำตอบ:
FindBugs วิธีการเริ่มต้นที่เกี่ยวข้องกับการตั้งค่าไฟล์ XML aka ฟิลเตอร์ นี่สะดวกกว่าโซลูชัน PMD น้อยกว่าจริง ๆ แต่ FindBugs ทำงานบน bytecode ไม่ใช่ในซอร์สโค้ดดังนั้นความคิดเห็นจึงไม่ใช่ตัวเลือก ตัวอย่าง:
<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
เนื่องจากการปะทะกันกับชื่อของ SuppressWarnings
Java
<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 ไม่ต้องสนใจว่า Package the Annotation คืออะไร
@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 ของคุณโดยใช้ไฟล์ -> การตั้งค่าอื่น ๆ -> การตั้งค่าเริ่มต้น -> การตั้งค่าอื่น ๆ -> FindBugs-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'
ชื่อgradle และคำอธิบายประกอบ@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") สตริง s = null; ฉันคิดว่าวิธีที่ดีที่สุดที่คุณสามารถทำได้คือแยกรหัสด้วยคำเตือนเป็นวิธีที่เล็กที่สุดที่คุณสามารถทำได้จากนั้นจึงหยุดการเตือนบนวิธีทั้งหมด
java.lang.SuppressWarnings
ไม่สามารถทำงานได้ มันมีการเก็บรักษาแหล่งที่มาดังนั้นจึงไม่สามารถมองเห็นข้อบกพร่องได้