2012-12-28 54 views
228

我看到了一些Java中的方法聲明爲:@Nullable註解的使用

void foo(@Nullable Object obj) 
{ ... } 

什麼的@Nullable這裏的含義是什麼?這是否意味着輸入可能是null? 沒有註解,輸入仍然可以爲空,所以我猜這不僅僅是它?

感謝

+2

從下面的答案,我已經瞭解到,註釋指示空值是可以接受的,它是用來在那裏的例子,代碼分析器我可以嘗試和解釋可能會有所不同。看看爲什麼這個格式是好的? + 1s,特別是提出這個問題。 – icedwater

+2

哪個庫在你的問題的上下文中提供'@ Nullable'?它是[Checker?](https://checkerframework.org/manual/#nullness-checker) – 8bitjunkie

回答

252

這清楚地表明,該方法接受空值,而且,如果你覆蓋的方法,你也應該接受空值。

它也可以作爲代碼分析器的提示,如FindBugs。例如,如果這樣的方法在不首先檢查null的情況下解引用其參數,FindBugs將發出警告。

+9

http://findbugs.sourceforge.net/ – MrSmith42

64

此註解通常用於消除NullPointerExceptions@Nullable經常說這個參數可能是null。這種行爲的好例子可以在Google Guice中找到。在這個輕量級的依賴注入框架中,你告訴這個依賴關係可能是null。如果你試圖通過null而沒有註釋,框架會拒絕做它的工作。

什麼是@Nullable可能與@NotNull註釋一起使用。在這裏你可以用find一些提示如何正確使用它們。 IntelliJ中的代碼檢查會檢查註釋並幫助調試代碼。

6

@Nullable聲明的元素聲明空值對於返回(對於方法),傳遞給(對於參數)和保持(對於局部變量和字段)是完全有效的。

@NotNull聲明空值是禁止返回(對於方法),傳遞給(對於參數)和保持(對於局部變量和字段)。

當覆蓋/實現帶註釋聲明或參數的方法時,@Nullable@NotNull之間存在協方差 - 逆變關係。

重寫/實現與一個帶註釋的聲明的方法:

  • @NotNull註釋父方法的需要
    @NotNull註釋爲子類方法。
  • 與父方法的註釋@Nullable方法可以在子類 方法 要麼@Nullable@NotNull註解。

重寫/實施方法與註釋的參數:

  • @Nullable註釋在父方法 參數的需要@Nullable註釋爲子類方法 參數。
  • 與父 方法@NotNull標註的參數的方法可以有@Nullable@NotNull註釋(或他們沒有 )的子類方法的參數。

實施例:

@Nullable 
public static UserContext getThreadUserContext() { 
    TransactionParms tp = TransactionParms.getBoundParms(); 
    return (tp == null) ? null : tp.getUserContext(); 
} 

這裏getThreadUserContext方法必須返回的TransactionParms一個實例。卜該實例可以Null