1. java-hell.de
  2. Temas
  3. Excepciones
Tema 9 de 11

Aprende excepciones en Java – try, catch, finally

Los programas fallan; la única pregunta es si estás preparado. Aprenderás a capturar excepciones con try y catch, a tratar distintos tipos de error y a limpiar con finally.

Los ejercicios

Lo que aprenderás en este tema

  1. El programa se estrella
  2. No es un número válido
  3. Manejar dos excepciones
  4. finally: siempre al final
Ejercicio 1 de 4

El programa se estrella

A veces en tu código pasan cosas que Java simplemente no puede manejar, por ejemplo dividir entre cero.

Entonces Java lanza una excepción y tu programa se estrella.

Atrapa la excepción con try { ... } catch (ArithmeticException e) { ... } e imprime ¡Entre cero no! en su lugar.

Código inicial
void main() {
    int x = 10 / 0;
    IO.println(x);
}
Contexto
¿Qué es una excepción?

Una excepción es un objeto que Java crea cuando algo sale mal. Ejemplos: dividir entre 0 (ArithmeticException), acceder a null (NullPointerException), un índice de array demasiado grande (ArrayIndexOutOfBoundsException).

Sin try/catch, la excepción sube por los métodos que hicieron la llamada. Si nadie la atrapa, el programa muere, con un stack trace en la terminal.

Con try/catch atrapas la excepción y puedes reaccionar, sin que tu programa se estrelle.

Ejercicio 2 de 4

No es un número válido

Integer.parseInt("abc") lanza una NumberFormatException: el texto no es un número.

Atrapa la excepción e imprime ¡No es un número! en vez del valor.

Código inicial
void main() {
    int numero = Integer.parseInt("abc");
    IO.println(numero);
}
Ejercicio 3 de 4

Manejar dos excepciones

Un bloque try puede tener varios bloques catch, uno por cada tipo de excepción.

El código del editor accede a arr[5], pero el array solo tiene 3 elementos: una ArrayIndexOutOfBoundsException.

Envuelve la línea en try/catch y maneja los dos casos:

  • ArrayIndexOutOfBoundsException → imprime ¡Índice demasiado grande!
  • NullPointerException → imprime ¡Null!
Código inicial
void main() {
    int[] arr = {10, 20, 30};
    IO.println(arr[5]);
}
Contexto
Orden de los bloques catch

Java recorre los bloques catch de arriba abajo y usa el primero que encaje. Por eso las excepciones más específicas tienen que ir antes que las más generales; si no, el bloque general se lo quedaría todo (de hecho, el compilador rechaza el orden incorrecto con un error "already been caught").

Desde Java 7 puedes combinar varios tipos de excepción en un solo catch: catch (IOException | SQLException e).

Ejercicio 4 de 4

finally: siempre al final

El bloque finally se ejecuta siempre, haya habido una excepción o no.

Se usa, por ejemplo, para cerrar limpiamente archivos o conexiones.

Amplía el código: después del catch, añade un bloque finally que imprima Listo.

La salida debería ser:

¡Ups!
Listo.
Código inicial
void main() {
    try {
        int x = 10 / 0;
    } catch (ArithmeticException e) {
        IO.println("¡Ups!");
    }
}
Contexto
¿Cuándo se ejecuta finally?

Siempre. Da igual si el bloque try terminó normalmente, si se lanzó una excepción (atrapada o no) o si un return salió del try/catch. Las únicas excepciones: System.exit() o un crash de la JVM.

Desde Java 7 existe try-with-resources: try (Scanner s = new Scanner(...)) cierra las cosas automáticamente, sin necesidad de finally.

Basta de leer. Te toca.

En el tutorial escribes el código tú mismo, pulsas Ejecutar y ves al instante si tu programa funciona. Sin JDK, sin IDE, sin rollos.

Practicar Excepciones en tu navegador