← CC2008

Excepciones

Semestre 02, 2026

Excepciones

Evento anómalo durante la ejecución que interrumpe el flujo normal del programa.

1Java crea un objeto Exception
2Ese objeto se lanza (throw)
3Se busca un catch que lo maneje
4Si no, se propaga hacia arriba

Jerarquía en Java


Throwable
 ├─ Error              (fallos graves: no capturar)
 │   ├─ OutOfMemoryError
 │   └─ StackOverflowError
 └─ Exception
     ├─ RuntimeException   (no chequeadas)
     │   ├─ NullPointerException
     │   └─ ArithmeticException
     ├─ IOException        (chequeadas)
     └─ SQLException

Tipos de excepciones

Chequeadas

Verificadas por el compilador. Obligan a try/catch o throws. Recuperables. Ej.: IOException, SQLException.

No chequeadas

Heredan de RuntimeException. Indican bugs. No obligan a capturarlas. Ej.: NullPointerException.

Captura (try / catch)


try {
    Files.readString(Path.of("data.txt"));
} catch (FileNotFoundException e) {
    System.out.println("Archivo no encontrado");
} catch (IOException e) {
    System.out.println("Error de I/O");
}

Los catch van del más específico al más general.

Multi-catch


try {
    Files.readString(Path.of("data.txt"));
} catch (NoSuchFileException | AccessDeniedException e) {
    System.out.println("Archivo inaccesible");
} catch (IOException e) {
    e.printStackTrace();
}

finally

Siempre se ejecuta (haya o no excepción). Útil para liberar recursos.


FileReader fr = null;
try {
    fr = new FileReader("data.txt");
} catch (IOException e) {
    System.out.println("Error de lectura");
} finally {
    if (fr != null) fr.close();
}

Lanzar (throw)

Genera una excepción al detectar una condición inválida.


public int dividir(int a, int b) {
    if (b == 0) {
        throw new IllegalArgumentException("b != 0");
    }
    return a / b;
}

Propagar (throws)

Declara que el método puede lanzar una excepción hacia quien lo invoque. Obligatorio para las chequeadas.


public void cargar() throws IOException {
    Files.readString(Path.of("config.json"));
}

Excepciones personalizadas

Extiende Exception (chequeada) o RuntimeException (no chequeada).


public class SaldoInsuficienteEx extends RuntimeException {
    public SaldoInsuficienteEx(String mensaje) {
        super(mensaje);
    }
}

Con contexto adicional


public class OperacionBancariaEx extends Exception {
    private final String cuenta;
    private final double monto;

    public OperacionBancariaEx(String cta, double monto, String msg) {
        super(msg);
        this.cuenta = cta;
        this.monto = monto;
    }
}

Buenas prácticas

  • Captura solo lo que puedes manejar.
  • No silencies excepciones (nada de catch vacío).
  • Valida precondiciones con IllegalArgumentException.
  • Usa nombres claros: SaldoInsuficienteException.