Saltar a contenido

12. Test de repaso

UD3 — Control de Flujo y Depuración · RA3 — Escribe y depura código, analizando y utilizando las estructuras de control del lenguaje

IES Thiar — Pilar de la Horadada (Alicante) · Curso 2026-2027

Aspecto Valor
Resultado de aprendizaje RA: 3 — Escribe y depura código, analizando y utilizando las estructuras de control del lenguaje.
Criterios de evaluación CE 3.1 · CE 3.2 · CE 3.3 · CE 3.4 · CE 3.5 · CE 3.6 · CE 3.7 · CE 3.8 · CE 3.9 (repaso global).
Marco normativo RD 405/2023 · RD 450/2010 · RD 659/2023
Tecnología base Java 25 LTS (OpenJDK Temurin 25) — IntelliJ IDEA Community Edition
Horas estimadas ~2 h (de las 30 h de la UD3).

Requisitos previos: todas las secciones de UD3, de la 1 a la 11. Este test es un repaso global. Responde sin mirar las soluciones; al final de cada bloque encontrarás las respuestas.

Cómo usar este test: cada bloque cubre una sección de UD3. Hay preguntas de selección única, selección múltiple, rellenar huecos, comprensión de código y búsqueda de errores. Si fallas más de 2 preguntas de un bloque, repasa esa sección antes de seguir.


Bloque 1: Control de flujo — conceptos y diagrama (sección 1)

#

Pregunta 1

¿Cuántos tipos de estructuras de control existen en programación estructurada?

#

Pregunta 2

Según las leyes de De Morgan, !(A && B) equivale a:

#

Pregunta 3

¿Qué valor tendrá resultado después de ejecutar este código?

int a = 5, b = 3;
boolean resultado = (a > b) && (b > 0) || (a == 5);
#

Pregunta 4

Una de estas condiciones NO compila en Java. ¿Cuál?

#

Pregunta 5

En programación estructurada, cualquier algoritmo imaginable se puede escribir combinando solo tres tipos de estructuras de control: , y .
#

Pregunta 6

Completa la ley de De Morgan: la negación de "A && B" es "!A !B", y la negación de "A || B" es "!A !B".
Soluciones del Bloque 1
Pregunta Respuesta Justificación
1.1 b — Tres Selección, iteración y salto (Böhm y Jacopini, 1966).
1.2 b — !A \|\| !B De Morgan: la negación de "y" es "o no".
1.3 b — true (a > b) = true, (b > 0) = true, true && true = true.
1.4 c — if (18 <= edad <= 65) Java no admite rangos encadenados. Hay que descomponer.
1.5 selección, iteración, salto Los tres pilares de la programación estructurada.
1.6 \|\|, && De Morgan: !(A && B) = !A \|\| !B; !(A || B) = !A && !B.

Bloque 2: Selección — if / else if / else (sección 2)

#

Pregunta 7

¿Qué pasa si ejecutas el siguiente código?

1
2
3
4
int x = 5;
if (x = 10) {
    IO.println("Es diez");
}
#

Pregunta 8

¿Qué es el dangling else?

#

Pregunta 9

¿Qué imprime el siguiente código?

int nota = 7;
if (nota >= 9) {
    IO.println("Sobresaliente");
} else if (nota >= 7) {
    IO.println("Notable");
} else if (nota >= 5) {
    IO.println("Aprobado");
} else {
    IO.println("Suspenso");
}
#

Pregunta 10

El siguiente código tiene un bug. ¿Cuál es?

1
2
3
if (edad >= 18)
    IO.println("Mayor de edad");
    IO.println("Puedes votar");
#

Pregunta 11

Para comparar el contenido de dos String en Java, usa el método (o si no distingues mayúsculas). Nunca uses ==, que compara (misma referencia en memoria), no contenido.
Soluciones del Bloque 2
Pregunta Respuesta Justificación
2.1 c = es asignación. En Java no devuelve boolean.
2.2 b Ambigüedad de asociación del else sin llaves.
2.3 b — "Notable" 7 >= 9 es false, 7 >= 7 es true.
2.4 b Sin llaves, solo la primera línea pertenece al if.
2.5 .equals(), .equalsIgnoreCase(), identidad == compara referencias; .equals() compara contenido.

Bloque 3: Selección — switch expression (sección 3)

#

Pregunta 12

¿Qué es el fall-through en el switch clásico?

#

Pregunta 13

En el switch moderno con flecha (->), ¿es necesario poner break?

#

Pregunta 14

¿Qué imprime el siguiente código?

1
2
3
4
5
6
7
int dia = 6;
String tipo = switch (dia) {
    case 1, 2, 3, 4, 5 -> "Laborable";
    case 6, 7 -> "Fin de semana";
    default -> "Desconocido";
};
IO.println(tipo);
#

Pregunta 15

El siguiente switch expression NO compila. ¿Por qué?

1
2
3
4
5
6
7
8
9
String nombre = switch (dia) {
    case 1 -> "Lunes";
    case 2 -> "Martes";
    case 3 -> "Miércoles";
    case 4 -> "Jueves";
    case 5 -> "Viernes";
    case 6 -> "Sábado";
    case 7 -> "Domingo";
};
#

Pregunta 16

La palabra reservada se utiliza dentro de un bloque de un switch expression para devolver el valor de esa rama, equivalente al return dentro de un método.
Soluciones del Bloque 3
Pregunta Respuesta Justificación
3.1 b Fall-through: sin break, se ejecutan varios case seguidos.
3.2 b La flecha -> elimina el fall-through. No hay break.
3.3 b — "Fin de semana" dia = 6 coincide con case 6, 7.
3.4 c Falta default. El switch expression debe ser exhaustivo.
3.5 yield Devuelve el valor dentro de un bloque del switch expression.

Bloque 4: Iteración — while y do-while (sección 4)

#

Pregunta 17

¿Cuál es la diferencia fundamental entre while y do-while?

#

Pregunta 18

¿Qué produce el siguiente código?

1
2
3
4
5
int i = 0;
while (i > 5) {
    IO.println(i);
    i++;
}
#

Pregunta 19

¿Qué produce el siguiente código?

1
2
3
4
5
int i = 0;
do {
    IO.println(i);
    i++;
} while (i > 5);
#

Pregunta 20

El siguiente bucle es infinito. ¿Por qué?

1
2
3
4
5
6
7
8
int i = 0;
while (i < 10) {
    if (i % 2 == 0) {
        continue;
    }
    IO.println(i);
    i++;
}
#

Pregunta 21

El bucle comprueba la condición antes de entrar (precondición), mientras que el bucle la comprueba después (poscondición), garantizando al menos una ejecución.
Soluciones del Bloque 4
Pregunta Respuesta Justificación
4.1 b while = precondición; do-while = poscondición.
4.2 c 0 > 5 es false desde el principio. El while no entra.
4.3 b do-while ejecuta antes de comprobar. Imprime 0, sale.
4.4 b continue salta el i++ cuando i es par. i nunca cambia.
4.5 while, do-while Precondición y poscondición.

Bloque 5: Arrays unidimensionales (sección 5)

#

Pregunta 22

¿Cuál es el rango de índices válidos de un array de 7 elementos?

#

Pregunta 23

¿Cuál es el valor por defecto de los elementos de new String[5]?

#

Pregunta 24

¿Qué imprime el siguiente código?

int[] numeros = {10, 20, 30};
IO.println(numeros.length);
#

Pregunta 25

El siguiente código tiene un bug. ¿Cuál es?

1
2
3
4
int[] arr = new int[3];
for (int i = 0; i <= arr.length; i++) {
    IO.println(arr[i]);
}
#

Pregunta 26

El método de la clase String convierte un String en un char[], permitiendo acceder a cada carácter por .

El campo de un array (sin paréntesis) indica cuántos elementos tiene, mientras que el método de String (con paréntesis ()) indica cuántos caracteres tiene.

Soluciones del Bloque 5
Pregunta Respuesta Justificación
5.1 c — 0 a 6 Índices de 0 a length - 1.
5.2 b — null Los arrays de objetos se inicializan a null.
5.3 a — 3 .length sin paréntesis devuelve el número de elementos.
5.4 b <= en vez de <. La trampa nº 1 con arrays.
5.5 toCharArray(), índice, length, length() toCharArray() convierte a char[]; length (campo) vs length() (método).

Bloque 6: Iteración — for clásico (sección 6)

#

Pregunta 27

¿Qué imprime el siguiente código?

1
2
3
for (int i = 0; i < 5; i++) {
    IO.print(i + " ");
}
#

Pregunta 28

¿Qué imprime el siguiente código?

1
2
3
for (int i = 0; i < 10; i += 3) {
    IO.print(i + " ");
}
#

Pregunta 29

¿Qué imprime el siguiente código?

1
2
3
for (int i = 5; i > 0; i--) {
    IO.print(i + " ");
}
#

Pregunta 30

El siguiente código debería sumar los elementos de un array pero tiene dos bugs. ¿Cuáles son?

1
2
3
4
5
int[] nums = {1, 2, 3, 4, 5};
int suma = 0;
for (int i = 1; i <= nums.length; i++) {
    suma += nums[i];
}
#

Pregunta 31

En un for clásico, la se ejecuta una sola vez al principio, la se evalúa antes de cada iteración, y la se ejecuta después del cuerpo.
Soluciones del Bloque 6
Pregunta Respuesta Justificación
6.1 b — 0 1 2 3 4 i va de 0 a 4 (i < 5).
6.2 b — 0 3 6 9 i va de 3 en 3: 0, 3, 6, 9.
6.3 b — 5 4 3 2 1 i decrementa mientras i > 0.
6.4 b Dos bugs: i = 1 salta el primero; <= causa excepción.
6.5 inicialización, condición, actualización Las tres partes del for.

Bloque 7: Iteración — for-each (sección 7)

#

Pregunta 32

¿Cuál es la sintaxis del for-each?

#

Pregunta 33

¿Qué imprime el siguiente código?

1
2
3
4
int[] numeros = {10, 20, 30};
for (int n : numeros) {
    IO.print(n + " ");
}
#

Pregunta 34

El siguiente código intenta duplicar todos los elementos del array pero no funciona. ¿Por qué?

1
2
3
4
int[] nums = {1, 2, 3};
for (int n : nums) {
    n = n * 2;
}
#

Pregunta 35

¿Cuál es la regla de oro para elegir entre for-each y for clásico?

#

Pregunta 36

Para recorrer los caracteres de un String con for-each, primero hay que convertirlo a un array de caracteres usando el método . No se puede recorrer un String directamente con for-each porque String no implementa la interfaz .
Soluciones del Bloque 7
Pregunta Respuesta Justificación
7.1 b for (Tipo elemento : array) — sin índice.
7.2 b — 10 20 30 Recorre los valores, no los índices.
7.3 b n es una copia. Modificar n no cambia el array.
7.4 b for-each lee; for clásico escribe.
7.5 toCharArray(), Iterable String no es Iterable; hay que convertirlo.

Bloque 8: Bucles anidados, matrices y sentencias de salto (sección 8)

#

Pregunta 37

¿Qué hace break dentro de un bucle?

#

Pregunta 38

¿Qué hace continue dentro de un bucle?

#

Pregunta 39

En bucles anidados, ¿de qué bucle sale break?

1
2
3
4
5
6
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (j == 1) break;
        IO.println(i + "," + j);
    }
}
#

Pregunta 40

¿Cuántas iteraciones totales hace un bucle anidado 5 × 7?

#

Pregunta 41

En una matriz int[][] m de 3 filas × 4 columnas, m.length devuelve el número de (3), mientras que m[i].length devuelve el número de de la fila i (4).

Para salir de dos bucles anidados a la vez, se usa break con una (labeled break).

Soluciones del Bloque 8
Pregunta Respuesta Justificación
8.1 b break sale del bucle más cercano.
8.2 b continue salta a la siguiente iteración.
8.3 b Solo sale del bucle interno (j).
8.4 b — 35 5 × 7 = 35.
8.5 filas, columnas, etiqueta m.length = filas; m[i].length = columnas; labeled break para bucles anidados.

Bloque 9: Gestión de excepciones — try-catch-finally (sección 9)

#

Pregunta 42

¿Cuál es la diferencia entre checked y unchecked?

#

Pregunta 43

¿Es NumberFormatException checked o unchecked?

#

Pregunta 44

¿Qué excepción lanza Integer.parseInt("abc")?

#

Pregunta 45

El siguiente código tiene un error de compilación. ¿Cuál?

1
2
3
4
5
6
7
try {
    int n = Integer.parseInt(entrada);
} catch (Exception e) {
    IO.println("Error general");
} catch (NumberFormatException e) {
    IO.println("No es un número");
}
#

Pregunta 46

El bloque de un try-catch se ejecuta siempre, haya o no excepción. Se usa para limpieza de recursos.

La sentencia se usa para lanzar una excepción explícitamente, mientras que se usa en la firma de un método para declarar que puede lanzar una excepción checked.

Soluciones del Bloque 9
Pregunta Respuesta Justificación
9.1 b Checked: compilador obliga. Unchecked: opcional.
9.2 b — Unchecked Hereda de RuntimeException.
9.3 b parseInt("abc") lanza NumberFormatException.
9.4 b El orden debe ser específico → general.
9.5 finally, throw, throws finally siempre se ejecuta; throw lanza; throws declara.

Bloque 10: Depuración en IntelliJ IDEA (sección 10)

#

Pregunta 47

¿Qué atajo ejecuta el programa en modo depuración?

#

Pregunta 48

¿Qué hace Step Over (F8)?

#

Pregunta 49

¿Cuándo debes usar Step Into (F7)?

#

Pregunta 50

Tienes un bucle for que recorre 1000 elementos y el bug está en la iteración 523. ¿Cómo lo depuras de forma eficiente?

#

Pregunta 51

Para evaluar cualquier expresión Java en el punto de parada durante la depuración, usa la herramienta (atajo Alt+F8).

La ventana muestra todas las variables accesibles con sus valores actuales, mientras que la ventana permite añadir expresiones personalizadas para vigilar.

Soluciones del Bloque 10
Pregunta Respuesta Justificación
10.1 b — Shift+F9 Debug. Shift+F10 = Run.
10.2 b Step Over ejecuta sin entrar en métodos.
10.3 b Step Into solo para tus métodos.
10.4 a — Breakpoint condicional Condición i == 523.
10.5 Evaluate Expression, Variables, Watches Herramientas del depurador.

Bloque 11: assert y aserciones (sección 11)

#

Pregunta 52

¿Qué lanza Java cuando una aserción falla?

#

Pregunta 53

¿Está assert activado por defecto en Java?

#

Pregunta 54

¿Cuál es la diferencia entre assert y throw new Excepcion?

#

Pregunta 55

El siguiente código usa assert para validar entrada del usuario. ¿Por qué es incorrecto?

int edad = Integer.parseInt(IO.readln().trim());
assert edad >= 0 && edad <= 120 : "Edad fuera de rango";
#

Pregunta 56

Una es una condición que debe ser cierta antes de ejecutar un bloque (verifica las entradas). Una es una condición que debe ser cierta después de ejecutar un bloque (verifica las salidas).

Para activar las aserciones en IntelliJ IDEA, hay que añadir el flag en el campo VM options de la configuración de ejecución.

Soluciones del Bloque 11
Pregunta Respuesta Justificación
11.1 b — AssertionError Hereda de Error, no de Exception.
11.2 b — No Hay que poner -ea en VM options.
11.3 b assert = bugs del programador; excepciones = errores del usuario.
11.4 b Sin -ea, assert se ignora. La entrada se valida con if.
11.5 precondición, postcondición, -ea Pre/post-condiciones y activación.

Bloque 12: Repaso global — preguntas de razonamiento

#

Pregunta 57

El siguiente código debería sumar solo los números positivos de un array. ¿Es correcto? Si no, corrígelo.

1
2
3
4
5
6
7
int[] datos = {5, -3, 8, -2, 7};
int suma = 0;
for (int i = 0; i < datos.length; i++) {
    if (datos[i] > 0) {
        suma += datos[i];
    }
}
#

Pregunta 58

El siguiente código debería imprimir los números del 1 al 10, pero imprime del 0 al 9. ¿Dónde está el bug?

1
2
3
for (int i = 0; i < 10; i++) {
    IO.println("Número " + i);
}
#

Pregunta 59

¿Qué imprime el siguiente código?

1
2
3
4
5
6
int[] nums = {1, 2, 3, 4, 5};
int suma = 0;
for (int n : nums) {
    suma += n;
}
IO.println("Suma: " + suma + ", Media: " + (suma / nums.length));
#

Pregunta 60

El siguiente código tiene un bug de lógica. ¿Cuál es?

1
2
3
4
5
6
7
8
int[] numeros = {-5, -8, -3, -9, -2};
int max = 0;
for (int i = 0; i < numeros.length; i++) {
    if (numeros[i] > max) {
        max = numeros[i];
    }
}
IO.println("Máximo: " + max);