Yanıtlar:
FindBugs ilk yaklaşımı, filtreler olarak da bilinen XML yapılandırma dosyalarını içerir . Bu, PMD çözümünden gerçekten daha az uygundur, ancak FindBugs kaynak kodunda değil, bayt kodunda çalışır, bu nedenle yorumların bir seçenek olmadığı açıktır. Misal:
<Match>
<Class name="com.mycompany.Foo" />
<Method name="bar" />
<Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL" />
</Match>
Ancak, bu sorunu çözmek için FindBugs daha sonra sınıfta veya yöntem düzeyinde (bence XML'den daha uygun) kullanabileceğiniz ek açıklamalara (bkz. SuppressFBWarnings
) Dayalı başka bir çözüm getirdi . Örnek (belki de en iyisi değil, ama sadece bir örnek):
@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
value="HE_EQUALS_USE_HASHCODE",
justification="I know what I'm doing")
Java ile ad çakışması nedeniyle FindBugs 3.0.0 SuppressWarnings
lehine kaldırıldığını unutmayın .@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>
kullanmak istedikleri takdirde POM'larına eklemelidirler @SuppressFBWarnings
.
Diğerleri Bahsedildiği gibi, @SuppressFBWarnings
Ek Açıklama'yı kullanabilirsiniz . Kodunuza başka bir Bağımlılık eklemek istemiyorsanız veya ekleyemiyorsanız, Ek Açıklama'yı Kodunuza kendiniz ekleyebilirsiniz, Findbugs, Ek Açıklama Paketinin hangi pakette olduğunu umursamaz.
@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 "";
}
Kaynak: https://sourceforge.net/p/findbugs/feature-requests/298/#5e88
İşte bir XML filtresinin daha eksiksiz bir örneği (sadece bir snippet gösterdiği ve başlangıç <FindBugsFilter>
ve bitiş etiketlerini içermediği için yukarıdaki örnek kendi başına çalışmaz ):
<FindBugsFilter>
<Match>
<Class name="com.mycompany.foo" />
<Method name="bar" />
<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
</Match>
</FindBugsFilter>
Android Studio FindBugs eklentisini kullanıyorsanız, Dosya-> Diğer Ayarlar-> Varsayılan Ayarlar-> Diğer Ayarlar-> FindBugs-IDEA-> Filtre-> Filtre dosyalarını hariç tut-> Ekle'yi kullanarak XML filtre dosyanıza göz atın.
Sınıfı Güncelle
dependencies {
compile group: 'findbugs', name: 'findbugs', version: '1.0.0'
}
FindBugs Raporunu Bulma
Dosya: ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html
Belirli bir mesajı bulun
Ek açıklamanın doğru sürümünü içe aktarın
import edu.umd.cs.findbugs.annotations.SuppressWarnings;
Ek açıklamayı doğrudan sorunlu kodun üzerine ekleyin
@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")
Daha fazla bilgi için buraya bakın: findbugs Bahar Açıklaması
compile 'net.sourceforge.findbugs:annotations:1.3.2'
yerine daha kısa olan sözdizimini kullanabilirsiniz .
testCompile 'com.google.code.findbugs:annotations:3.0.0'
not ve ek açıklama adı@SuppressFBWarnings
Bunu yazarken (Mayıs 2018), FindBugs'ın yerini SpotBugs almıştır . SuppressFBWarnings
Ek açıklamayı kullanmak için kodunuzun Java 8 veya daha yeni bir sürümle derlenmesi gerekir ve derleme zamanı bağımlılığı sağlar spotbugs-annotations.jar
.
SpotBugs kurallarını filtrelemek için bir filtre dosyası kullanmanın böyle bir sorunu yoktur. Dokümantasyon burada .
Buradaki diğer cevaplar geçerli olsa da, bunu çözmek için tam bir tarif değildir.
Bütünlük ruhuyla:
Pom dosyanızda findbugs ek açıklamalarına sahip olmanız gerekir - bunlar sadece derleme süresidir, böylece provided
kapsamı kullanabilirsiniz :
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>findbugs-annotations</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
Bu, sağlayan @SuppressFBWarnings
başka bir bağımlılığın kullanılmasına izin verir @SuppressWarnings
. Ancak, yukarıdakiler daha açıktır.
Ardından ek açıklamayı yönteminizin üstüne ekleyin:
Örneğin
@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))) { ... }
Bu, hem hatanın adını hem de hata taramasını devre dışı bırakmanızın bir nedenini içerir.
Bunu burada bırakacağım: https://stackoverflow.com/a/14509697/1356953
Bunun java.lang.SuppressWarnings
ayrı bir ek açıklama kullanmaya gerek olmadığını unutmayın .
@SuppressWar alanı üzerindeki uyarılar, yalnızca o alan bildirimi için bildirilen findbugs uyarılarını bastırır, bu alanla ilişkili her uyarıyı bastırmaz.
Örneğin, bu "Yalnızca hiç boş değere ayarlanmış alan" uyarısını bastırır:
@SuppressWarnings ("UWF_NULL_FIELD") Dize s = null; Ben yapabileceğiniz en iyi uyarı ile kodunu en küçük yöntem içine izole olduğunu düşünüyorum, daha sonra tüm yöntemi uyarı bastırmak olduğunu düşünüyorum.
java.lang.SuppressWarnings
çalışamaz. Kaynak tutma özelliğine sahiptir, bu nedenle findbugs tarafından görülemez.