2010-05-07 15 views
9

Cuando ejecuto FindBugs en este código, informa NO problemas.Descubrir errores de NullPointerException usando FindBugs

boolean _closed = false; 

public void m1(@Nullable String text) { 
    if(_closed) 
     return; 

    System.out.println(text.toLowerCase()); 
} 

Mientras que aquí se encuentra cuestión como era de esperar:

public void m1(@Nullable String text) { 
    System.out.println(text.toLowerCase()); // FindBugs: text must be nonnull but is marked as nullable 
} 

¿Por qué fracasan en el primer caso?

+3

Probablemente significa FindBugs, la herramienta de análisis estático de Java, no Firebug, la extensión de Firefox, ¿verdad? – tzaman

+0

Ups .. Sí, FindBugs – alex2k8

+0

+1 ¡Buena pregunta! Y hasta ahora no hay una buena respuesta para eso. Tal vez es un error en findbugs? Esperaría que FindBugs se quejara también del segundo, pero veremos ... –

Respuesta

0

@Nullable solo en los parámetros, métodos o campos que desea permitir que sean nulos.

Parece que está permitiendo valores nulos para la variable de texto. Probablemente deberías usar @NonNull en su lugar.

Editar

I intentado hacer esto por mi mismo y tiene el mismo resultado.

El texto en el error findbugs (desde el segundo método que le da al insecto NullPointer) informe dice:

Este parámetro es siempre utilizado de una manera que exige que sea no nulo, pero el parámetro está explícitamente anotado como Nullable. O el uso del parámetro o la anotación es incorrecto.

Mi conjetura sería que ya que no es un final FindBugs de parámetros no puede/no hacen ninguna hipótesis sobre el valor de _closed ya que se puede cambiar en un momento posterior. Incluso traté de hacer que el método _closed variabel dentro del m1-method, y aún así no lo informe como un error.

+1

Considere que quiero poder llamar a m1() con valores 'nulos'. Entonces marco 'texto' como @Nullable. m1 solo debe manejar valores "nulos", pero no es así. Así que espero que FindBug reporte un problema, y ​​lo hace, pero solo en casos muy simples. – alex2k8

+0

Confundido por la respuesta ... ¿Quiere decir que FindBugs está informando un error cuando ejecuta mi código con la condición if (_closed)? – alex2k8

+0

Lo siento, obtuve el mismo resultado que usted. Intenté aclarar la respuesta ahora –

-1

Run JavaLint - sospecho que le dirá que

System.out.println(text.toLowerCase()); 

en el primer ejemplo es inalcanzable. Dado que es inalcanzable, supongo FindBug no le importa que podría causar una NullPointerException

+2

Observe que _closed es 'falso'. Además, _closed no es final, por lo que puede ser cambiado por algún otro método ... Como tal, el código es alcanzable. – alex2k8

0

Desea utilizar @CheckForNull en lugar de @Nullable

+1

Mismo resultado en mis pruebas. – alex2k8

1

Estoy de acuerdo con alex2k8. Probablemente se deba al miembro _closed data. Su inicialización es irrelevante siempre que no se declare como final. El análisis estático no tiene medios genéricos para determinar los valores reales de _closed en tiempo de ejecución, y ningún software puede hacerlo (es equivalente al Halting problem).

+0

En realidad, creo que el analizador estático debe examinar todas las ramas y advertir si alguien tiene un problema. – alex2k8

+0

@ alex2k8 El gran problema con este enfoque es que obtendrá tantos falsos positivos que la herramienta le resultará inútil (a menos que, por supuesto, sea partidario de administrar falsos positivos). – LeoR

+0

@ alex2k8 si quieres ver herramientas como ESC/Java. FindBugs tiene el objetivo específico de tener un bajo número de falsos positivos, en lugar de considerar exhaustivamente todas las situaciones posibles. –

1

Tomé fuentes FindBugs y buscó

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE 

encontrado dos archivos:

  1. BuildUnconditionalParamDerefDatabase.java
  2. InconsistentAnnotations.java

Ambos consideran "params incondicionales eliminación de referencias" solamente.

Parece que FindBugs no es tan útil para encontrar problemas nulo puntero :-(

PS

public void m1(@CheckForNull String text) { 
    if(_closed) // FindBugs: text must be nonnull but is marked as nullable 
     System.out.println(text.toUpperCase()); 
    else 
     System.out.println(text.toLowerCase()); 
} 
0

edu.umd.cs.findbugs.annotations.Nullable [destino] Campo , Método, Parámetro

El elemento anotado podría ser nulo en algunas circunstancias. En general, esto significa que los desarrolladores deberán leer la documentación para determinar cuándo es aceptable un valor nulo y wh éter es necesario verificar si hay un valor nulo. FindBugs tratará los elementos anotados como si no tuvieran anotación.

En la práctica, esta anotación solo es útil para anular una anotación general no nula.

http://findbugs.sourceforge.net/manual/annotations.html

+0

En realidad, consideran e informan problemas para esta anotación en algunos casos. Y Nullable o CheckForNull funcionaron de la misma manera para mí. – alex2k8

Cuestiones relacionadas