2011-04-18 15 views
5

Estoy tratando de agregar anotaciones compatibles con findbugs a un proyecto, pero noté que @Nonnull no siempre se procesa como era de esperar. Por ejemplo findbugs no da por sentado que las colecciones nativas estándar pueden devolver null:Anotaciones no nulas y paquetes estándar de Java

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

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

pasará las pruebas FindBugs a pesar de que no debe. ¿Puedo configurar findbugs de alguna manera para que esté alerta en este caso?

Respuesta

2

según la documentación,

El elemento anotada no debe ser nulo. Los campos anotados solo deben ser nulos después de que se haya completado la construcción. Los métodos anotados deben tener valores de retorno no nulos.

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

o puede utilizar @DefaultAnnotation (NonNull.class) en una clase o paquete, y luego usar @Nullable sólo en esos parámetros, métodos o campos que desee para permitir a ser nulo.

el análisis se realiza en la fuente.

así que pruebe esto, a mí me funciona

/** 
* @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"); 
} 

o puede probar un diseño de contratación a través de http://c4j.sourceforge.net/

+0

Esto no parece responder a la pregunta en absoluto. La pregunta era si es posible obtener Findbugs para darse cuenta de que HashMap puede devolver null, no cómo utilizar la anotación Nonnull en general. –

+0

ok, en lugar de hashmap, crea una clase digamos new XTZClass(), xyzObj.get (""), dentro del método return null en un bloque condicional. si eso es identificado por el findbug, es consciente del objeto gráfico y clase en tiempo de ejecución. esto es sólo una sugerencia – zudokod

+0

No estoy seguro de si el análisis estático funcionará en las bibliotecas ya compiladas – zudokod

Cuestiones relacionadas