El operador or se cortocircuita cuando el primer operando es verdadero. Por lo tanto,
String foo = null;
if (true || foo.equals("")) {
// ...
}
no arroja un NullPointerException
.
Como señala correctamente @prajeesh en los comentarios, en la forma en que se usa un cortocircuito en el código real es para evitar un NullPointerException
siempre que se trate de una API que podría devolver nulo. Así, por ejemplo, si hay un método que devuelve readStringFromConsole
o bien la cadena disponibles actualmente o nulo si el usuario no escribe nada, podríamos escribir
String username = readStringFromConsole();
while (username == null || username.length() == 0) {
// No NullPointerException on the while clause because the length() call
// will only be made if username is not null
System.out.println("Please enter a non-blank name");
username = readStringFromConsole();
}
// Now do something useful with username, which is non-null and of nonzero length
Como nota al margen, una API que devuelve la entrada del usuario debe devolver la cadena vacía siempre que el usuario no escriba nada, y no debe devolver nulo. La devolución nula es una forma de decir "no hay nada disponible", mientras que devolver la cadena vacía es una forma de decir "el usuario no escribió nada", por lo que es preferible.
El cortocircuito ocurrirá cuando el resultado del primer operando pueda definir el resultado de la operación lógica. Para '&&' el primer devenir 'false' hará que el resultado sea' false' definitivamente y para '||' el primero que se haga verdadero hará definitivamente 'verdadero' el resultado. Entonces, el primer operando que sea 'verdadero' cortará siempre el circuito para el operador '||'. –
¿Por qué es menos sencillo con ||? Es exactamente tan sencillo como con &&. El cálculo de expresiones se detiene cuando se conoce el valor de la condición completa. Las expresiones se evalúan de izquierda a derecha. –
@ MichaelSchmeißer: lo siento, no sé cómo me lo perdí siendo sencillo. – Vivek