這兩者有什麼區別?這兩者似乎都意味着該值可能爲空,並應予以相應處理,即檢查無效。javax.annotation:@Nullable vs @CheckForNull
更新:以上 兩個註解是JSR-305的一部分/ FindBugs的: http://findbugs.sourceforge.net/manual/annotations.html
這兩者有什麼區別?這兩者似乎都意味着該值可能爲空,並應予以相應處理,即檢查無效。javax.annotation:@Nullable vs @CheckForNull
更新:以上 兩個註解是JSR-305的一部分/ FindBugs的: http://findbugs.sourceforge.net/manual/annotations.html
我認爲這是從您添加的鏈接很明顯:如果你使用@CheckForNull
和使用該代碼值不檢查null
,FindBugs會將其顯示爲錯誤。
FindBugs將忽略@Nullable
。
實際上,這個註釋僅用於覆蓋總體的
NonNull
註釋。
在必須始終檢查該值的情況下使用@CheckForNull
。使用@Nullable
其中null
可能沒問題。
編輯:看起來@CheckForNull
目前得不到支持,所以我建議避免它,並使用@NonNull
(也請參閱Which @NotNull Java annotation should I use?)。 另一個想法是直接與FindBugs開發人員取得聯繫,並詢問他們對文檔不一致的看法。
從亞歷山大的答案運行代碼後,我從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
看起來像FindBugs中的一個bug給我... – lbalazscs
我在這裏找不到任何提及的@CheckForNull:http://findbugs.sourceforge.net/bugDescriptions.html(@NonNull is there ) – vitaly
@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());
}
}
Eclipse找到完全相同的**,前提條件是它將被配置爲執行「空分析」並使用正確的註釋(默認情況下它使用JDT註釋而不使用JSR-305)。 有趣的是,@CheckForNull註釋沒有配置(但它有@NonNullByDefault)。 – vitaly
FindBugs 2.0.1檢測到「@ CheckForNull」情況:「由於調用方法的返回值而可能出現空指針取消引用」。 –
@DavidHarkness - 我無法使用2.0.1複製它:https://github.com/lischenko/flaming-ninja(請參閱findbugs.null.analysis)。 findbugs-maven-plugin = v2.5.2 - 最新的註釋= 2.0.1 – vitaly
在IntelliJ IDEA的@javax.annotation.Nullable
默認情況下和任何企圖支持取消引用@Nullable
參數或者返回值將導致警告。
@ alexander-pavlov,您可以在配置「恆定條件&例外」檢查中添加@javax.annotation.CheckForNull
。去文件 - >設置 - >檢查 - >可能的錯誤 - >恆定條件&例外 - >配置註釋。
我更喜歡這樣做,因爲@CheckForNull
比上面的回答中提到的@lbalazscs的@Nullable
更清晰。
我不認爲這些註釋來自Java Bean Validation的API。你使用的是什麼庫/框架?沒有它的註釋文檔嗎? –
似乎都不是常規Java API的一部分。他們在哪裏實施? – vainolo
更新了說明。它是JSR-305的一部分,我使用的實現是FindBugs。 – vitaly