Java Tema 2
Condicionales y bucles
Concepto#
Las estructuras de control permiten modificar el flujo de ejecución de un programa. Con ellas podemos, especialmente:
- Tomar decisiones (seleccionar si se ejecuta un código u otro en función de un valor o condición).
- Repetir bloques de código (bucles).
Según el teorema de la estructura, todo programa puede construirse únicamente con:
- Secuencia: instrucciones ejecutadas en orden.
- Selección: permite bifurcaciones en función de condiciones.
- Iteración: repite un bloque de instrucciones.
Operadores#
Los operadores son símbolos que se utilizan habitualmente para comprobar condiciones.
Operadores de comparación#
Operadores para comparar datos. Dan siempre true o false. En los ejemplos, int a = 5; e int b = 3;:
| Operador | Significa | Ejemplo | Resultado |
|---|---|---|---|
== | Igual que | a == b | false |
!= | Distinto de | a != b | true |
> | Mayor que | a > b | true |
< | Menor que | a < b | false |
>= | Mayor o igual que | a >= 5 | true |
<= | Menor o igual que | a <= 4 | false |
Importante
Para comparar se usan dos iguales, ==. Uno solo, =, no compara: guarda un valor en la variable.
Operadores lógicos#
Operadores utilizados para poder hacer más de una comprobación
&&→ AND (true si ambas condiciones son verdaderas)||→ OR (true si al menos una condición es verdadera)!→ NOT (niega la condición)
Todas las combinaciones posibles (la llamada tabla de verdad):
A | B | A && B | A || B | !A |
|---|---|---|---|---|
true | true | true | true | false |
true | false | false | true | false |
false | true | false | true | true |
false | false | false | false | true |
Por ejemplo, edad >= 16 && edad < 18 solo es true si la edad es 16 o 17.
Estructuras condicionales en Java#
Condicional simple – if#
Cuando solo queremos comprobar si se cumple una condición para realizar una acción.
if (edad >= 18) {
// programación si se cumple
}Condicional doble – if-else#
Cuando queremos realizar una acción si se cumple la condición, y otra acción si no se cumple.
if (edad >= 18) {
// programación si se cumple
} else {
// programación si no se cumple
}Condicional múltiple - if - else if - else#
Cuando queremos realizar diferentes acciones en función del resultado de la condición.
if (edad >= 18) {
// programación que se ejecuta si es mayor de 18 años
} else if (edad >= 16 && edad < 18) {
// programación que se ejecuta si tiene entre 16 y 18 años
} else {
// programación que se ejecuta si no ha cumplido ninguna de las anteriores condiciones (en este caso, si es menor de 16 años)
}Condicional múltiple – switch#
Permite ejecutar un código u otro en función del valor que tenga una variable. Similar al if - else if - else, pero aquí no se compara (no hay símbolos <, >, ==, etc.), solo se mira qué hay en la variable y en cada caso se realiza una acción.
String estacion = "Verano";
switch (estacion) {
case "Verano":
System.out.println("hace calor");
break;
case "Invierno":
System.out.println("hace frio");
break;
default:
System.out.println("no se reconoce esa estación"); //Valores distintos a los anteriores
}Operador ternario#
Es una forma compacta de hacer un if-else, que utilizan usuarios más avanzados. No es necesario que aprendas a usarla todavía, pero está bien saber que existe.
variable = (condición) ? valor_si_verdadero : valor_si_falso;Estructuras iterativas (bucles)#
Bucle for#
Se usa cuando se conoce el número exacto de iteraciones (Ejemplo: repetir 10 veces).
for (int i = 0; i < 10; i++) {
// programación que se repetirá 10 veces
}En este bucle podemos ver:
int i = 0: creamos la variable contadori < 10: decimos que se repita mientras la i sea menor que 10i++: decimos que laivaya aumentando de 1 en 1.
Bucle while#
Se trata de un bucle que se repite mientras se cumpla una determinada condición. Deja de repetirse la instrucción cuando la condición deje de cumplirse. Es decir, es un mientras, no un hasta.
while (puntos > 0) {
// programación que se repetirá mientras puntos sea mayor que cero
}Bucle do-while#
Exactamente igual que el bucle while, con la única diferencia de que primero ejecuta la instrucción que tiene en su interior, y después comprueba si la condición se cumplía. Esto asegura que las instrucciones internas se ejecuten al menos una vez.
do {
// programación que se ejecuta una vez y se repite mientras puntos sea mayor que cero
} while (puntos > 0);Sentencias de salto#
Un bucle, e incluso otras estructuras, pueden interrumpirse con las siguientes instrucciones:
| Instrucción | Qué hace |
|---|---|
break | Interrumpe el bucle (o el switch) y sigue con lo que haya después |
continue | Se salta lo que queda de esta vuelta y pasa a la siguiente |
Equivalencias entre bucles#
Todos los bucles (while, do-while, for) son equivalentes en potencia. Esto quiere decir que un mismo problema podrá resolverse con diferentes bucles. Se recomienda elegirlos según el problema:
| Bucle | Cuándo usarlo | Comprueba la condición… | Mínimo de veces que se ejecuta |
|---|---|---|---|
for | Sabes cuántas veces se repite | antes de cada vuelta | 0 |
while | Se repite mientras se cumpla una condición | antes de cada vuelta | 0 |
do-while | Igual que while, pero tiene que hacerse al menos una vez (por ejemplo, un menú) | después de cada vuelta | 1 |
Pausas: Thread.sleep#
Para hacer una cuenta atrás, o para que el texto no salga todo de golpe, el programa tiene que esperar. Thread.sleep(…) lo para el tiempo que le digas, en milisegundos: 1000 son 1 segundo.
for (int i = 5; i >= 1; i--) {
System.out.println(i);
try {
Thread.sleep(1000); // espera 1 segundo
} catch (InterruptedException e) {
// si algo interrumpe la espera, seguimos sin más
}
}
System.out.println("¡Despegue!");¿Por qué el try y el catch? Mientras el programa espera, otra parte de él podría despertarlo antes de tiempo. Es raro, pero puede pasar, y Java obliga a decir qué hacer en ese caso: si escribes Thread.sleep(1000); sin más, el programa ni siquiera compila.
| Parte | Cómo se lee | Qué va dentro |
|---|---|---|
try { … } | «Intenta esto» | La pausa: Thread.sleep(1000); |
catch (InterruptedException e) { … } | «Si interrumpen la pausa, haz esto en vez de pararte» | Normalmente nada: el programa sigue con lo siguiente |
Es tu primera excepción: un error que Java te obliga a atender. Las verás con más calma en el tema de ficheros, donde pasa lo mismo cuando un fichero no existe.
Consejo
VS Code lo escribe por ti: pon el cursor sobre el Thread.sleep subrayado en rojo, pulsa la bombilla (o Ctrl + .) y elige Surround with try/catch.
Errores frecuentes#
| Mensaje o síntoma | Qué significa | Cómo se arregla |
|---|---|---|
incompatible types: int cannot be converted to boolean | Has escrito if (x = 5): con un solo = no se compara, se asigna | Usa ==: if (x == 5) |
reached end of file while parsing | Falta cerrar alguna llave } | Cuenta las llaves: cada { necesita su }. Indentar bien el código ayuda a verlo |
El if siempre se ejecuta, se cumpla o no | Hay un ; justo después del paréntesis: if (x > 0); | Quita ese ;. Detrás de la condición va la llave {, no el punto y coma |
| El programa no termina nunca (bucle infinito) | La condición del bucle nunca llega a ser false | Comprueba que dentro del bucle cambia la variable de la condición (por ejemplo, el i++ del for) |
Un switch ejecuta también los casos siguientes | Falta el break al final de un case | Pon break; al final de cada case |
unreported exception InterruptedException; must be caught or declared to be thrown | Has escrito Thread.sleep(…) sin su try y su catch | Rodéalo con try { … } catch (InterruptedException e) { }, como en Pausas |
Comparar textos con == no funciona | En Java los String se comparan con .equals() | if (respuesta.equals("si")). Lo verás en el tema de textos |