Pregunta

Tengo dicho código:

if(object != null && object.field != null){
    object.field = "foo";
}

Supongamos que objeto es nulo.

¿este resultado código en nullPointerException o simplemente si no se ejecutará declaración?

Si lo hace, cómo refactorizar el código sea más elegante (si es posible, por supuesto)?

¿Fue útil?

Solución

Java tiene evaluación de cortocircuito, es decir, el código debe estar bien

Otros consejos

&& hace cortocircuito mientras & haría no.

Pero con preguntas sencillas como esta, lo mejor es a modo de prueba (Ideone puede ayudar cuando usted no tiene acceso a una máquina).

&& - http://ideone.com/LvV6w Y - http://ideone.com/X5PdU

Finalmente el lugar para comprobar con seguridad sería el JLS §15.23 . No es la cosa más fácil de leer, los estados sección relevante: El operador && es como Y ( §15.22. 2 ), pero evalúa su mano derecha operando sólo si el valor de su mano izquierda operando es cierto.

La mejor manera de averiguarlo sería probarlo, especialmente para una sola pregunta línea. Habría sido más rápido, también.

La respuesta es que Java no ejecutará el cuerpo del "si".

Esto no va a arrojar alguna NullPointerException. La condición se evalúa de izquierda a derecha y de la expresión primera false momento se encontró que no evaluará la expresión restante.

Una forma de saberlo! ¡Pruébalo! ¿Cómo? Así, hacer un método que imprime algo:

public static boolean test(int i)
{
    System.out.println(i);
    return false;
}

...

if (test(1) && test(2) && test(3))
{
    // not reached
}

Esta impresora:

1

Así que la respuesta a su pregunta es "no".

Java tiene una evaluación de corto circuito, por lo que va a estar bien.

El código se ve bien para mí, pero es lo que realmente necesita para comprobar object.field != null? Creo que la prueba se puede omitir ya que nunca se utiliza la variable, simplemente configurarlo.

En una nota lateral, la mayoría de los programadores no campos de acceso directo (object.field), sino más bien a través getters / setters (object.setField(x);). Sin más contexto a seguir, no puedo decir si esto es apropiado en su caso.

&& y || condiciones se detiene en el punto de que puedan decidir si la condición es verdadera / falsa, en su caso, la condición se detendrá inmediatamente después object != null y creo que su código está muy bien para este caso

Si desea que todos sus expresiones booleanas evaluada independientemente del valor de verdad de cada uno, entonces usted puede utilizar y e | en lugar de && y ||. Sin embargo, asegúrese de utilizar estos sólo en las expresiones booleanas. A diferencia && y ||, y e | también tienen un significado para los tipos numéricos que es completamente diferente de su significado para booleanos. http://ibiblio.org/java/course/week2/46.html

A pesar de cortocircuito sería trabajar aquí, no es una garantía de que (como he hecho muchas veces) que obtendrá el orden equivocado al escribir otra, sería mejor práctica para anidar los if y definir el orden que desee los controles booleanos para romper:

if(object != null) 
{
    if(object.field != null)
    {
        object.field = "foo";
    }
}

Esto hace exactamente lo mismo que básicamente estás diciendo, si el primer control booleano falla no lo haga el segundo; también es nullPointerException seguro como object.field no se comprobará a menos objeto no es nulo

El uso de un cortocircuito en booleanos puede llegar a ser molesto después como cuando se tiene un bool múltiple si la declaración se hace más difícil de manera eficiente depuración qué parte cortocircuito.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top