¿El Java Ver todos los argumentos en “&&” operador (y), incluso si uno de ellos es falsa?
-
09-10-2019 - |
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)?
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".
Tal vez esta otra pregunta que ayuda a:
Las diferencias en los operadores booleanos: Y vs && y | vs ||
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.