Excepciones y Manejo de Errores
Java divide las excepciones en dos categorías. Las checked exceptions (como IOException) representan errores que cualquier código razonable debería anticipar y manejar: archivo no encontrado, conexión rechazada. El compilador te obliga a manejarlas con try/catch o declararlas en la firma del método con throws. Las unchecked exceptions (subclases de RuntimeException, como NullPointerException, ArrayIndexOutOfBoundsException) representan bugs de programación que no deberían ocurrir en código correcto.
Try-with-resources (Java 7+) es la forma correcta de manejar recursos que deben cerrarse: archivos, conexiones a base de datos, sockets. Sin este patrón, necesitabas un bloque finally para cerrar el recurso, y si el cierre también lanzaba excepción, el código se complicaba mucho.
Con try (FileReader r = new FileReader(path)) {}, Java cierra automáticamente el recurso al salir del bloque, incluso si ocurrió una excepción. Las excepciones personalizadas te permiten comunicar errores específicos del negocio con información relevante.
// Jerarquía: Throwable → Error / Exception
// Exception → CheckedException / RuntimeException
// Excepciones checked (obligatorio try/catch o throws)
public void leerArchivo(String ruta) throws IOException {
FileReader reader = new FileReader(ruta);
// ... leer archivo
}
// Try-catch-finally
public int dividir(int a, int b) {
try {
return a / b;
} catch (ArithmeticException e) {
System.out.println("Error: " + e.getMessage());
return 0;
} finally {
System.out.println("Operación completada");
}
}
// Multi-catch (Java 7+)
try {
// código peligroso
} catch (NullPointerException | IllegalArgumentException e) {
System.out.println("Error: " + e.getMessage());
}
// Excepción personalizada
public class SaldoInsuficienteException extends RuntimeException {
private final double saldoActual;
public SaldoInsuficienteException(double saldo, double intento) {
super(String.format("Saldo %.2f insuficiente para %.2f", saldo, intento));
this.saldoActual = saldo;
}
public double getSaldoActual() { return saldoActual; }
}
// Try-with-resources (Java 7+) - cierra automáticamente
try (FileReader reader = new FileReader("archivo.txt");
BufferedReader br = new BufferedReader(reader)) {
String linea;
while ((linea = br.readLine()) != null) {
System.out.println(linea);
}
} // Se cierra automáticamente aunque haya excepción
Practica esta lección
Resuelve los ejercicios del curso de Java en la app, gratis y con corrección automática.
Empezar a practicar