2010-01-08 23 views
26

Supongamos que tengo la siguiente expresiónorden de expresión booleana de evaluación en Java?

Eclipse me advierte que myString podría ser nulo en la segunda frase de la expresión booleana. Sin embargo, sé que algunos compiladores saldrán completamente de la expresión booleana si falla la primera condición. ¿Es esto cierto con Java? ¿O el orden de evaluación no está garantizado?

+0

¿Qué compilador o herramienta estás usando? – notnoop

+0

¿Por qué debería importar? – danben

+0

Bueno, javac (el compilador más común) no advierte sobre la nulidad. Si "Java me advierte que myString podría ser nulo", es muy probable que se trate de una herramienta con errores. No existe tal cosa como "java warns". – notnoop

Respuesta

44

Sin embargo, sé que algunos compiladores saldrán completamente de la expresión booleana si falla la primera condición. ¿Es esto cierto con Java?

Sí, lo que se conoce como Short-Circuit evaluation .Operators como && y || son los operadores que realizan este tipo de operaciones.

¿El orden de evaluación no es el garantizado?

No, se garantiza el orden de evaluación (de izquierda a derecha)

1

Sí, Java practica la evaluación diferida de sentencias if de esta manera. if myString == null, el resto de la instrucción if no se evaluará

7

Java debería evaluar sus declaraciones de izquierda a derecha. Utiliza un mecanismo conocido como short-circuit evaluation para evitar que se prueben las condiciones segunda, tercera y enésima si la primera es falsa.

Por lo tanto, si su expresión es myContainer != null && myContainer.Contains(myObject) y myContainer es nula, la segunda condición, myContainer.Contains(myObject) no será evaluada.

Editar: Como alguien más mencionó, Java en particular tiene operadores de cortocircuito y no cortocircuito para condiciones booleanas. El uso de && activará la evaluación de cortocircuito y & no lo hará.

+1

Citando: 'Para evitar que se prueben las condiciones segunda, tercera y enésima si la primera es falsa'. En realidad, si el operador es '||' el compilador no puede concluir el valor total desde el primero solo si el primero es falso. – H2ONaCl

2

James y Ed son correctos. Si se encuentra con un caso en el que desea que se evalúen todas las expresiones, independientemente de las condiciones fallidas anteriores, puede utilizar el operador booleano no cortocircuito &.

Cuestiones relacionadas