2017-01-26 22 views
8

Ben diğer programcılar (ve kendim!) Bir yöntemin ne iade edebileceği hakkında bir ipucu vermek için yöntemler üzerinde @Nonnull ve @Nullable ek açıklamaları kullanıyorum. Sonunda bir sınıfta Findbugs'ı çalıştırmaya karar verdim (IntelliJ - FindBugs-IDEA v1.0.1) ve gördüğüm davranışları anlamıyorum. Dokümanlar da işe yaramadı.Findbugs neden bir yöntem için gereksiz bir nullcheck verir, ancak diğer

ı Aşağıdaki örnek kod var diyelim:

import javax.annotation.Nonnull; 

public class Main { 

    public static void main(String[] args) { 
    } 

    @Nonnull 
    public static String myFunc(){ 
     return new String("foo"); 
    } 

    @Nonnull 
    public static String myFunc2(){ 
     return "foo"; 
    } 
} 

Findbugs bayrakları myFunc() 'in return ifadesi 'boş olmayan olduğu bilinen değerin Gereksiz nullcheck' sahip olarak, fakat (myFunc2 ile mutlu).

Findbug'ların bunları farklı görmesi bekleniyor mu? (Dokümanlara link takdir edilecektir) @Nonnull'ın yöntemlerde kullanımını tamamen yanlış anlamış mıyım?

[değiştir]

bazı araştırma sonra (sözleşme ihlalleri hataları değişti birlikte) org.jetbrains @Contract açıklama daha iyi benim ihtiyaçlarına hizmet edecek karar verdik. Yardımınız için teşekkür ederim Guillaume F.!

+0

Ne boş olabilir ama 'new String kullanmak temelde gerekli asla olabilir ("dize") '. –

+0

Açıkçası. Sadece benim gerçek kodumdan çok daha basit bir örnek oluşturuyor. –

+0

Ancak, ilgili ayrıntıları atladığınıza benziyor: String dizilerini kullanmanıza olanak veren 'String'lerdir; Yoksa başka bir şey mi? –

cevap

1

Null-Check ne anlama geldiğini anlamalısınız. Findbugs size bu uyarıyı verdiğinde, iki kez bir Boş Çekme yaptığınız ve ikinci kez gerekli olmadığı anlamına gelir. Hangisi senin örneğiyle uyuşuyor.

Ilk kodda,bir Özel Durum atar, çünkü new String("foo") örtük bir geçersiz denetim yapar. Yani bu yeni String nesnesi, null olmayan olarak kontrol edilir. Sonra yöntemi terk ederken başka bir @Nonnull kontrol yapın. Findbugs bunu görür ve size uyarı verir.

Ham kodunuzu döndürdüğünüzden ve @Nonnull denetimini yalnızca bir kez yaptığınızdan, ikinci kodunuzda böyle bir denetim yoktur. Herşey yolunda.


Bunun yerine edu.umd.cs.findbugs.annotations.NonNull kullanmak isteyeceksiniz. Bu gerçek bir çek olmadan, null olmayan bir sonuç istediğiniz Findbugs sadece ima edecek.

Maven kullanıyorsanız:

<dependency> 
     <groupId>com.google.code.findbugs</groupId> 
     <artifactId>annotations</artifactId> 
     <version>${findbugs-annotations.version}</version> 
     <scope>provided</scope> 
    </dependency> 

https://blogs.oracle.com/java-platform-group/entry/java_8_s_new_type

Which @NotNull Java annotation should I use?

+0

Teşekkürler - açıklamanız mantıklı. Ne yazık ki, edu.umd.cs.findbugs.annotations.NonNull kullanarak sonucu değiştirmez - sadece hala gereksiz kontrol hakkında şikayet değil, aynı zamanda kullanımdan kaldırılmış olarak gösterir ve javax.annotation.Nonnull kullanarak önerir. Bence en iyi bahse girerim, Findbugs'a bir alternatif aramaktır, çünkü bu davranış istediğim şey değildir. –

+0

Bu özel uyarı, sizi rahatsız ediyorsa Findbugs seçeneklerinde devre dışı bırakabilir veya '@ SuppressWarnings' kullanabilirsiniz: http://stackoverflow.com/questions/1829904/is-there-a-way-to-ignore-a- tek-bulbugs-uyarı Düzenlemenizi gördüm, bir çözüm bulduğuna sevindim. Cevabım yardımcı olursa, onu böyle işaretleyebilir misiniz? Teşekkür ederim. –