Codemaker Java

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;:

OperadorSignificaEjemploResultado
==Igual quea == bfalse
!=Distinto dea != btrue
>Mayor quea > btrue
<Menor quea < bfalse
>=Mayor o igual quea >= 5true
<=Menor o igual quea <= 4false

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):

ABA && BA || B!A
truetruetruetruefalse
truefalsefalsetruefalse
falsetruefalsetruetrue
falsefalsefalsefalsetrue

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.

Java
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.

Java
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.

Java
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.

Java
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.

Java
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).

Java
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 contador
  • i < 10: decimos que se repita mientras la i sea menor que 10
  • i++: decimos que la i vaya 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.

Java
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.

Java
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ónQué hace
breakInterrumpe el bucle (o el switch) y sigue con lo que haya después
continueSe 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:

BucleCuándo usarloComprueba la condición…Mínimo de veces que se ejecuta
forSabes cuántas veces se repiteantes de cada vuelta0
whileSe repite mientras se cumpla una condiciónantes de cada vuelta0
do-whileIgual que while, pero tiene que hacerse al menos una vez (por ejemplo, un menú)después de cada vuelta1

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.

Java
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.

ParteCómo se leeQué 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íntomaQué significaCómo se arregla
incompatible types: int cannot be converted to booleanHas escrito if (x = 5): con un solo = no se compara, se asignaUsa ==: if (x == 5)
reached end of file while parsingFalta 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 noHay 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 falseComprueba que dentro del bucle cambia la variable de la condición (por ejemplo, el i++ del for)
Un switch ejecuta también los casos siguientesFalta el break al final de un casePon break; al final de cada case
unreported exception InterruptedException; must be caught or declared to be thrownHas escrito Thread.sleep(…) sin su try y su catchRodéalo con try { … } catch (InterruptedException e) { }, como en Pausas
Comparar textos con == no funcionaEn Java los String se comparan con .equals()if (respuesta.equals("si")). Lo verás en el tema de textos