2017-01-26 60 views
8

我一直在使用方法上的@Nonnull和@Nullable註釋來給其他程序員(以及我自己!)關於方法可以返回的線索。我終於決定實際上在一個類上運行Findbugs(IntelliJ - FindBugs-IDEA v1.0.1),我不明白我看到的行爲。文件也沒有幫助。爲什麼findbugs會爲一種方法提供冗餘的空檢查,而不是其他方法

比方說,我有以下示例代碼:

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的標誌myFunc的()的返回語句具有‘已知非空值冗餘nullcheck’,但很高興與myfunc2所( )。

預計findbugs會看到這些不同嗎? (鏈接到文檔將不勝感激)我完全誤解@Nonnull方法的使用?

[編輯]

經過一番研究,我已經決定,org.jetbrains @Contract註釋(合同違規變更爲錯誤)將更好地滿足我的需求。謝謝Guillaume F.的幫助!

+0

也不能爲null,但它基本上將沒有必要使用'新的String( 「字符串常量」) '。 –

+0

顯然。它只是比我的實際代碼更簡單的例子。 –

+0

但是這聽起來像是在省略相關細節:它們是否是字符串,允許您使用字符串文字;或者他們是別的東西? –

回答

1

您必須瞭解冗餘空值檢查的含義。當Findbugs給你這個警告時,這意味着你做了兩次空值檢查,而第二次沒有必要。這與你的例子相符。

在第一個代碼中,new String("foo")做了隱式空檢查,因爲new String(null)將拋出一個異常。所以這個新的String對象隱式檢查爲非null。然後在離開方法時再做@Nonnull檢查。 Findbugs看到這個並給你警告。

在您的第二個代碼中,自從您返回一個原始字符串並僅執行一次@Nonnull檢查以來就沒有這種控制。一切安好。


也許你會想用edu.umd.cs.findbugs.annotations.NonNull代替。這一個只會提示Findbugs你想要一個非空結果,而沒有真正的檢查。

如果您正在使用Maven:

<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

謝謝 - 你的解釋是有道理的。不幸的是,使用edu.umd.cs.findbugs.annotations.NonNull不會改變結果 - 它不僅會抱怨冗餘檢查,它還會顯示爲已棄用,並建議使用javax.annotation.Nonnull。我認爲我最好的選擇是尋找Findbugs的替代品,因爲這種行爲不是我想要的。 –

+0

如果您困擾您,可以在Findbugs選項中禁用此特定警告,或者您可以使用'@ SuppressWarnings':http://stackoverflow.com/questions/1829904/is-there-a-way-to-ignore-a-單findbugs警告我看到你的編輯,很高興你找到了解決方案。如果我的回答有幫助,你能標記它嗎?謝謝。 –

相關問題