2012-09-06 44 views
34

這兩者有什麼區別?這兩者似乎都意味着該值可能爲空,並應予以相應處理,即檢查無效。javax.annotation:@Nullable vs @CheckForNull

更新:以上 兩個註解是JSR-305的一部分/ FindBugs的: http://findbugs.sourceforge.net/manual/annotations.html

+0

我不認爲這些註釋來自Java Bean Validation的API。你使用的是什麼庫/框架?沒有它的註釋文檔嗎? –

+0

似乎都不是常規Java API的一部分。他們在哪裏實施? – vainolo

+0

更新了說明。它是JSR-305的一部分,我使用的實現是FindBugs。 – vitaly

回答

27

我認爲這是從您添加的鏈接很明顯:如果你使用@CheckForNull和使用該代碼值不檢查null,FindBugs會將其顯示爲錯誤。

FindBugs將忽略@Nullable

實際上,這個註釋僅用於覆蓋總體的NonNull註釋。

在必須始終檢查該值的情況下使用@CheckForNull。使用@Nullable其中null可能沒問題。

編輯:看起來@CheckForNull目前得不到支持,所以我建議避免它,並使用@NonNull(也請參閱Which @NotNull Java annotation should I use?)。 另一個想法是直接與FindBugs開發人員取得聯繫,並詢問他們對文檔不一致的看法。

+0

從亞歷山大的答案運行代碼後,我從FindBugs獲得的唯一警告是 'nonnull()可能會返回null,但會聲明@NonNull at test.java:[line 19]在com.db.icestation.test方法中。nonnull()' 錯誤描述爲'Method可能返回null,但聲明爲@NonNull。此方法可能返回空值,但該方法(或其覆蓋的超類方法)被聲明爲返回@NonNull。 Bug類型和模式:NP - NP_NONNULL_RETURN_VIOLATION' – vitaly

+0

看起來像FindBugs中的一個bug給我... – lbalazscs

+0

我在這裏找不到任何提及的@CheckForNull:http://findbugs.sourceforge.net/bugDescriptions.html(@NonNull is there ) – vitaly

9

@Nonnull@Nullable由IntelliJ IDEA正確處理。 FindBugs發現@Nonnull的問題,但錯過了@Nullable@CheckForNUll。 IDEA和FindBugs檢測到的問題用註釋標記。

package com.db.icestation; 

import javax.annotation.CheckForNull; 
import javax.annotation.Nonnull; 
import javax.annotation.Nullable; 

public class test { 

    public @Nullable String nullable() { 
     return ""; 
    } 
    public @Nonnull String nonnull() { 
     return null; // IDEA, findbugs 
    } 
    public @CheckForNull String checkForNull() { 
     return null; 
    } 

    public static void main(String[] args) { 
     System.out.println(new test().nullable().length()); // IDEA 
     System.out.println(new test().nonnull().length()); 
     System.out.println(new test().checkForNull().length()); 
    } 
} 
+0

Eclipse找到完全相同的**,前提條件是它將被配置爲執行「空分析」並使用正確的註釋(默認情況下它使用JDT註釋而不使用JSR-305)。 有趣的是,@CheckForNull註釋沒有配置(但它有@NonNullByDefault)。 – vitaly

+1

FindBugs 2.0.1檢測到「@ CheckForNull」情況:「由於調用方法的返回值而可能出現空指針取消引用」。 –

+0

@DavidHarkness - 我無法使用2.0.1複製它:https://github.com/lischenko/flaming-ninja(請參閱findbugs.null.analysis)。 findbugs-maven-plugin = v2.5.2 - 最新的註釋= 2.0.1 – vitaly

3

在IntelliJ IDEA的@javax.annotation.Nullable默認情況下和任何企圖支持取消引用@Nullable參數或者返回值將導致警告。

@ alexander-pavlov,您可以在配置「恆定條件&例外」檢查中添加@javax.annotation.CheckForNull。去文件 - >設置 - >檢查 - >可能的錯誤 - >恆定條件&例外 - >配置註釋。

我更喜歡這樣做,因爲@CheckForNull比上面的回答中提到的@lbalazscs的@Nullable更清晰。