2011-04-18 4 views
5

findbugs 호환 어노테이션을 프로젝트에 추가하려고하지만 @Nonnull이 항상 예상대로 처리되지 않는 것으로 나타났습니다. 예를 들어, findbugs를 들어 표준 기본 컬렉션이 null을 반환 할 수 있다고 가정하지 않습니다Nonnull 어노테이션과 표준 자바 패키지

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

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

가 findbugs 테스트도 말아야하지만 전달합니다. 이 경우에 findbugs를 경고하도록 구성 할 수 있습니까?

답변

2

설명서에 따라

주석이 달린 요소는 null이 아니어야합니다. Annotated Fields는 공사가 완료된 후에 만 ​​null이 될 수 없습니다. 주석 첨부 메소드는, null 이외의 반환 값을 가질 필요가 있습니다.

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

또는 당신은 클래스 또는 패키지에 @DefaultAnnotation (NonNull.class)를 사용하고 단지 당신이 null이 될 수 있도록하려면 이러한 매개 변수, 메소드 또는 필드에 @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이 Nonnull 주석을 일반적으로 사용하는 방법이 아닌 null을 반환 할 수 있음을 인식하게 할 수 있는지 여부입니다. –

+0

ok, hashmap 대신 클래스를 작성하십시오. 메소드 내에 새로운 XTZClass(), xyzObj.get ("")이 있습니다. 조건 블록에서 null을 리턴합니다. 그것이 findbug에 의해 식별되면 런타임에 객체 그래프와 클래스를 인식합니다. 이것은 단지 제안입니다 – zudokod

+0

정적 분석이 이미 컴파일 된 라이브러리에서 작동하는지 확실하지 않습니다 – zudokod