Curso: Excepciones en Java
Guía práctica — teoría, ejemplos y ejercicios.
🔹 Módulo 1 — Introducción a las excepciones
Una excepción es un evento que interrumpe el flujo normal de ejecución de un programa cuando ocurre una condición anómala (por ejemplo: división por cero, error de E/S, índice fuera de rango).
Throwable
├── Error
└── Exception
├── Checked
└── Unchecked (RuntimeException)
🔹 Módulo 2 — Manejo básico: try, catch, finally
Ejemplo simple de try-catch
que captura una ArithmeticException
:
public class Division {
public static void main(String[] args) {
try {
int resultado = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Error: división entre cero.");
}
}
}
Uso de finally
— siempre se ejecuta incluso si ocurre una excepción:
try {
int[] numeros = {1, 2, 3};
System.out.println(numeros[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Índice fuera de rango.");
} finally {
System.out.println("Bloque finally: siempre se ejecuta.");
}
🔹 Módulo 3 — Checked vs Unchecked
Checked Exceptions deben ser manejadas o declaradas con throws
(ej.: IOException
).
import java.io.FileReader;
import java.io.IOException;
public class Archivo {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("archivo.txt");
} catch (IOException e) {
System.out.println("No se pudo abrir el archivo.");
}
}
}
Unchecked Exceptions heredan de RuntimeException
y no es obligatorio capturarlas.
public class Ejemplo {
public static void main(String[] args) {
String texto = null;
System.out.println(texto.length()); // NullPointerException
}
}
🔹 Módulo 4 — throw y throws
throw lanza una excepción explícitamente. throws declara que el método puede lanzar ciertas excepciones.
public class Validacion {
public static void validarEdad(int edad) {
if (edad < 18) {
throw new IllegalArgumentException("Debes ser mayor de edad.");
}
}
public static void main(String[] args) {
validarEdad(15);
}
}
import java.io.*;
public class Lector {
public static void leerArchivo(String ruta) throws IOException {
FileReader fr = new FileReader(ruta);
fr.close();
}
public static void main(String[] args) {
try {
leerArchivo("noexiste.txt");
} catch (IOException e) {
System.out.println("Error de lectura: " + e.getMessage());
}
}
}
🔹 Módulo 5 — Excepciones personalizadas
Crear excepciones específicas para reglas de negocio ayuda a que el código sea más claro y fácil de mantener.
class EdadInvalidaException extends Exception {
public EdadInvalidaException(String mensaje) {
super(mensaje);
}
}
public class Registro {
public static void registrarEdad(int edad) throws EdadInvalidaException {
if (edad < 0 || edad > 120) {
throw new EdadInvalidaException("Edad inválida: " + edad);
}
System.out.println("Edad registrada: " + edad);
}
public static void main(String[] args) {
try {
registrarEdad(-5);
} catch (EdadInvalidaException e) {
System.out.println(e.getMessage());
}
}
}
🔹 Módulo 6 — Buenas prácticas
- Capturar excepciones específicas en lugar de
catch (Exception e)
cuando sea posible. - Usar mensajes claros y localizables en las excepciones.
- No ocultar errores silenciosamente; al menos loguea o re-lanza.
- Usar excepciones personalizadas para casos de negocio.
- Evitar lógica compleja dentro de
catch
; delega al manejador o registra el error.
🔹 Módulo 7 — Ejercicios prácticos
Crear clase Cuenta
con saldo
y método retirar(amount)
. Lanzar una excepción personalizada SaldoInsuficienteException
si el saldo es insuficiente.
Implementar un validador que lance WeakPasswordException
cuando la contraseña no cumpla condiciones (longitud mínima, mayúscula, número, símbolo).
Leer un archivo línea a línea. Manejar FileNotFoundException
y mostrar un mensaje amigable con el nombre del archivo.
Clase Banco
que permita transferencias entre cuentas; lanzar TransferenciaInvalidaException
en transferencias no permitidas (monto negativo, cuentas iguales, etc.).