2011-04-18 126 views
5

我試圖添加findbugs兼容註釋到一個項目,但注意到@Nonnull並不總是像我期望的那樣處理。例如FindBugs的不假定標準本地集合可以返回null:Nonnull註釋和標準java包

void method(@Nonnull String bar) {...} 

map = new HashMap(); 
method(map.get("foo")); 

將通過FindBugs的測試,即使它不應該。在這種情況下,我可以配置findbugs以提醒它嗎?

回答

2

根據文檔,

帶註釋的元素不能爲空。在施工完成後,帶註釋的字段必須不能爲空。帶註釋的方法必須具有非空的返回值。

@Documented 
@Target(value={FIELD,METHOD,PARAMETER,LOCAL_VARIABLE}) 
@Retention(value=CLASS) 
@Nonnull(when=ALWAYS) 
@TypeQualifierNickname 
public @interface NonNull 

,或者你可以在一個類或包使用@DefaultAnnotation(NonNull.class),然後只對要允許爲空這些參數,方法或字段使用@Nullable。

分析是在源代碼上完成的。

所以試試這個,它爲我工作

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    method(getValue()); 
} 

private static void method(@NonNull Object obj){ 
    System.out.println(obj); 
} 

@CheckForNull 
private static Object getValue(){ 
    Map map = new HashMap(); 
    return map.get("foo"); 
} 

,或者您可以使用http://c4j.sourceforge.net/

+0

這似乎並沒有在所有回答問題嘗試契約式設計。問題是,是否有可能讓Findbugs意識到HashMap可以返回null,而不是一般如何使用Nonnull註釋。 – 2011-04-18 15:37:11

+0

好吧,而不是hashmap,創建一個類,說新的XTZClass(),xyzObj.get(「」),在方法內部返回null在一個條件塊。如果findbug識別它,它會在運行時知道對象圖和類。這只是一個建議 – zudokod 2011-04-18 15:42:38

+0

我不確定靜態分析是否可以在已編譯的庫上工作 – zudokod 2011-04-18 15:46:37