Bucles do-while y while en Java

Los bucles do-while y while en Java son los únicos que quedan en la lista de artículos sobre estructuras de Java que incluyen una condición booleana. Son muy similares, y en este artículo vamos a ver, como es costumbre, su estructura, funcionamiento y posibles trampas que te puedes encontrar en el examen OCAJ8P.

More...

Después del descanso de Navidad y Año Nuevo, ha llegado el momento de reanudar el aprendizaje :).

¿Qué son los bucles do-while y while en Java?

Bucles do-while y while en Java

Reflejos de reflejos, en bucle

Los bucles do-while y while en Java te permiten, como su nombre indica (while significa mientras), repetir una acción en un bucle siempre y cuando se cumpla una condición booleana de control. Es posible que el código contenido en un bucle while no se ejecute, porque no se cumpla la condición. No obstante, el código contenido en un bucle do-while se ejecuta, por lo menos, una vez.

Si quieres saber más sobre los bucles en Java, échale un ojo también al artículo que he publicado sobre los bucles for y for-each.

¿Cuál es la estructura de los bucles do-while y while en Java?

La diferencia entre ambos es que, en el bucle while, la condición booleana se evalúa antes de que se ejecute el código. En cambio, en un bucle do-while primero se ejecuta una vez el código (do) y, a continuación, se evalúa la condición. Si esta no se cumple, el hilo de ejecución sale del bucle.

Como ves, tanto el bucle do-while como el bucle while solo evalúan una condición dada. A diferencia del bucle for, no contienen en su estructura ningún elemento que la modifique. En los bucles do-while y while en Java es responsabilidad tuya asegurarte de que la condición se cumple antes o después. De lo contrario, entras en un bucle infinito:

Uso de las llaves en los bucles do y do-while

Tanto el bucle do-while como el while pueden prescindir de las llaves si solo contienen una línea de codigo. Recuerda que "una línea" termina con el primer punto y coma:

No olvides colocar un punto y coma (;) después de la evaluación while en el bucle do-while.

No obstante, si el bucle while no contiene código, puedes prescindir de las llaves. Con el bucle do-while no puedes hacerlo:

Fíjate que, en este caso, cuando prescindes de las llaves en el bucle while también has de usar un punto y coma.

Por el contrario, el bucle do-while sin código no puede prescindir de las llaves:

Recuerda: un bucle do-while puede prescindir de las llaves únicamente cuando contiene una línea de código.

Compartir

Condición booleana: ámbito de la variable

En un artículo anterior sobre las condiciones booleanas ya te expliqué las diversas estructuras que podía adoptar un condición booleana. Como sabes, las condiciones booleanas suelen aparecer antes del código que se ejecuta si esta se cumple. Una excepción ocurre, como acabas de ver, en el bucle do-while.

En el caso del bucle do-while, no puedes evaluar una referencia, o variables, declaradas dentro del mismo bucle.

Esto se debe a una razón obvia.

Aunque modificases el valor de la variable o del objeto al que apunta la referencia, con cada iteración esta referencia o variable se volvería a declarar, volviendo a adquirir su valor original.

Uso del valor false explícito o de variables finales

En el bucle while no puedes utilizar como condición booleana:

  • El valor false explícito, ya que eso significa que el código que contenga el bucle es inalcanzable (unreachable code). 
  • Una variable booleana, o un objeto de tipo Boolean, marcado como final y cuyo valor sea false. Lo importante en este caso es que la variable o el objeto Boolean están marcados como final. Si no lo están, el compilador no ve el valor que contienen (o al que apuntan, en caso de ser un objeto). Una variable u objeto final es inmutable, y el compilador sí tiene en cuenta su valor al realizar su tarea. En este caso, pues, si la variable es final y su valor es false, el código que contiene el bucle es, de nuevo, inalcanzable.

Dicho esto, ¿qué crees que ocurre en el siguiente ejemplo?

A pesar de que el bucle while no contiene código, no se puede utilizar una variable booleana con el valor false y marcada como final. No tiene sentido, pero es así.

El bucle do-while, al permitir que el código que contiene se ejecute por lo menos una vez, no tiene estas limitaciones. No importa qué condición booleana utilices. El código nunca va a ser inalcanzable.

Ejercicios de hoy

Tienes que estar muy atento a estos pequeños detalles cuando te enfrentes al examen. Te aconsejo que utilices un editor de texto sencillo (sin colores), para acostumbrarte a ver código sin resaltar. 

Además, el editor de texto te va a obligar a insertar los imports necesarios, que un IDE realiza en segundo plano.

Practica las estructuras básicas varias veces; intenta pensar en cómo podrían pillarte en el examen. Sabes, por ejemplo, que una asignación devuelve un valor, que coincide con el valor asignado?

Mira el siguiente ejemplo:

¿Entiendes qué ocurre?