2011-07-13 12 views
5

estoy teniendo error findbugs para el código de abajo,FindBugs - redundante Comparación con NULL

if(obj instanceof CustomerData) 
{ 
    CustomerData customerData = (CustomerData)obj; 

    if (customerData == null) 
    { 
     errors.reject("Error", "Null data received"); 
    } 
} 

Error Desc:

nullcheck redundante de obj, que se sabe que es no nulo en (Nombre del paquete y método, lo he eliminado debido a una violación de la seguridad)

Este método contiene una verificación redundante de un valor no nulo conocido frente a la constante nula.

Por favor, que me haga saber lo que es el error aquí.

+1

A partir del error, supongo que 'CustomerData customerData = (CustomerData) obj;' arrojaría una excepción si 'obj' era nulo, para ello esta' si (CustomerData == null) 'es redundante (o, el código anterior deja claro que' obj' es 'no null'). – forsvarir

+0

He agregado el código "si la condición". – Srinivasan

Respuesta

11

instanceof devuelve false si el argumento es null. Entonces no necesitas otro cheque.

3

que he añadido comentarios en línea a continuación ...

Según this, instanceof vuelve false, para una instancia null.

if(obj instanceof CustomerData) 
{ 

    /* To get here, obj must be a non-null instance of CustomerData, 
    * so the following cast will always succeed and result in a non-null 
    * customerData 
    */ 

    CustomerData customerData = (CustomerData)obj; 

    /* customerData cannot be null because of the conditions above, so 
    * this check is pointless (it'll never be triggered 
    */ 

    if (customerData == null) 
    { 
     /* This line cannot be reached, because of the conditions above */ 
     errors.reject("Error", "Null data received"); 
    } 
} 
1

Al parecer obj no puede ser nulo en el contexto de que el registro en particular. Los Findbugs pueden decirlo y te advierten que elimines el control de redudant. A menos que nos proporcione el código fuente donde se declara/define obj, no podemos ayudarlo más.

Dicho esto, los errores FindBugs/advertencias no son necesariamente un problema. En este caso, por ejemplo, si considera que el cheque puede ser necesario en el futuro, simplemente puede ignorar la advertencia. Un caso común sería durante la prueba donde codifica objetos de entrada para probar una ruta de código específica, pero aún necesita la verificación nula en producción por seguridad.

EDITAR (A raíz de la pregunta de edición):

Bueno, null instanceof <Whatever> siempre es falsa, por lo que el instanceof condicional en el código garantiza que obj no puede ser nulo. En este caso, es probable que desee eliminar el cheque nulo - es superfluo y Findbugs hizo bien en señalarlo ...