2012-09-06 34 views
34

¿Cuál es la diferencia entre los dos? Ambos parecen querer decir que el valor puede ser nulo y debe tratarse de acuerdo con esto, es decir, debe verificarse por nulo.javax.annotation: @Nullable vs @CheckForNull

Actualizar: Las dos anotaciones anteriores son parte de JSR-305/FindBugs: http://findbugs.sourceforge.net/manual/annotations.html

+0

No creo que esas anotaciones provengan de la API de Java Bean Validation. ¿Qué biblioteca/marco estás usando? ¿No tiene documentación para sus anotaciones? –

+0

Ninguno parece ser parte de una API de Java normal. ¿Dónde están implementados? – vainolo

+0

Actualizó la descripción. Es parte de JSR-305 y la implementación que estoy usando es FindBugs. – vitaly

Respuesta

27

Creo que es bastante claro desde el enlace que ha añadido: si utiliza @CheckForNull y el código que utiliza el el valor no marca null, FindBugs lo mostrará como un error.

FindBugs ignorará @Nullable.

En la práctica, esta anotación es útil solo para anular una anotación omnipresente de NonNull.

Use @CheckForNull en los casos en que el valor siempre debe estar marcado. Use @Nullable donde null podría estar bien.

EDITAR: parece que @CheckForNull no está bien soportado en este momento, entonces sugiero evitarlo y usar @NonNull (también vea Which @NotNull Java annotation should I use?). Otra idea sería ponerse en contacto directamente con los desarrolladores de FindBugs y pedirles su opinión sobre la incoherencia en la documentación.

+0

La única advertencia que recibí de FindBugs después de ejecutar el código de la respuesta de Alexander es 'nonnull() puede devolver nulo, pero está declarado @NonNull At test.java:[line 19] En el método com.db.icestation.test.nonnull() ' La descripción de los errores es' El método puede devolver nulo, pero se declara @NonNull. Este método puede devolver un valor nulo, pero el método (o un método de superclase que anula) se declara para devolver @NonNull. Tipo y patrón de error: NP - NP_NONNULL_RETURN_VIOLATION' – vitaly

+0

Parece un error en FindBugs para mí ... – lbalazscs

+0

No puedo encontrar ninguna mención de @CheckForNull aquí: http://findbugs.sourceforge.net/bugDescriptions.html (@NonNull está ahí) – vitaly

9

@Nonnull y @Nullable son manejados correctamente por IntelliJ IDEA. FindBugs encontró el problema con @Nonnull pero se perdió los de @Nullable y @CheckForNUll. Los problemas que fueron detectados por IDEA y FindBugs están marcados con comentarios.

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()); 
    } 
} 
+0

Eclipse encuentra exactamente lo mismo, ** siempre que ** esté configurado para realizar 'Análisis nulo' y utilice las anotaciones correctas (de manera predeterminada utiliza anotaciones JDT y no JSR-305). Curiosamente, no hay configuración para la anotación @CheckForNull (pero tiene @NonNullByDefault). – vitaly

+1

FindBugs 2.0.1 detecta el caso '@ CheckForNull':" Posible desreferencia del puntero nulo debido al valor devuelto del método llamado ". –

+0

@DavidHarkness - No puedo reproducirlo usando 2.0.1: https://github.com/lischenko/flaming-ninja (see findbugs.null.analysis). findbugs-maven-plugin = v2.5.2 - la última, anotaciones = 2.0.1 – vitaly

3

En la Idea IntelliJ @javax.annotation.Nullable es apoyada por defecto y cualquier intento de eliminar la referencia @Nullable argumentos o valores de retorno resultará en advertencia.

@ alexander-pavlov, Puede agregar @javax.annotation.CheckForNull en la configuración de "Condiciones constantes & excepciones" de inspección. Ir a Archivo-> Configuración-> Inspecciones-> Errores probables-> Condiciones constantes & excepciones-> Configurar anotaciones.

Prefiero hacer esto como @CheckForNull tiene un significado más claro que @Nullable como @lbalazscs mencionado en su respuesta anterior.

Cuestiones relacionadas