Manejo de errores en Java: try/catch y más — guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Manejo de errores en Java: try/catch y más: de la A a la Z



El manejo de errores es uno de los conceptos clave en Java que todo desarrollador debe dominar. A diferencia de muchos lenguajes, Java ofrece un sistema de excepciones (exceptions) estricto y bien diseñado que permite escribir código robusto y predecible. En este artículo, cubriremos todo: desde el básico try/catch hasta mecanismos avanzados como try-with-resources y excepciones personalizadas.



1. Fundamentos: qué son las excepciones y la jerarquía de clases



Una excepción (exception) es un evento que interrumpe el flujo normal de ejecución de un programa. En Java, todas las excepciones son objetos de clases que heredan de Throwable. Las ramas principales de la jerarquía son:



  • Error — problemas críticos que normalmente no se manejan (por ejemplo, OutOfMemoryError).
  • Exception — excepciones que el programa puede manejar.
  • RuntimeException (subclase de Exception) — excepciones en tiempo de ejecución que no es necesario verificar en tiempo de compilación.


Todas las excepciones se dividen en dos tipos:

  • Checked (verificadas) — son obligatorias de manejar. El compilador no compilará el código si no las maneja con try/catch o no las declara con throws. Ejemplos: IOException, SQLException.
  • Unchecked (no verificadas) — heredan de RuntimeException. No es necesario manejarlas explícitamente. Ejemplos: NullPointerException, ArithmeticException.


2. Mecanismo básico: try, catch, finally



El bloque básico de manejo de excepciones consta de tres partes:



try {    // Código que puede lanzar una excepción    int result = 10 / 0;} catch (ArithmeticException e) {    // Manejo de la excepción    System.err.println("¡Error: división por cero!");} finally {    // Este bloque se ejecuta siempre (incluso si hubo una excepción)    System.out.println("Bloque finally ejecutado.");}


Puntos importantes:

  • El bloque catch puede ser uno o varios para diferentes tipos de excepciones.
  • El bloque finally es opcional, pero útil para cerrar recursos (archivos, conexiones).
  • Si la excepción no es capturada, se propaga hacia arriba en la pila de llamadas.


Multi-catch (Java 7+) — permite capturar múltiples tipos de excepciones en un solo bloque:



try {    // código} catch (IOException | SQLException e) {    System.err.println("Error de E/S o SQL: " + e.getMessage());}


3. Try-with-resources: cierre automático de recursos



A partir de Java 7, se introdujo el mecanismo try-with-resources, que cierra automáticamente los recursos que implementan la interfaz AutoCloseable (o Closeable). Esto elimina la necesidad de escribir finally para cerrar archivos, sockets, etc.



try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {    String line = reader.readLine();    System.out.println(line);} catch (IOException e) {    System.err.println("Error al leer el archivo: " + e.getMessage());} // reader se cierra automáticamente


Ventajas:

  • El código es más limpio y corto.
  • Los recursos se cierran en el orden correcto (inverso al de su creación).
  • Si se lanza una excepción tanto en el bloque try como al cerrar, la excepción suprimida (suppressed) se añade a la principal.


Puede declarar varios recursos separados por punto y coma:



try (BufferedReader br = new BufferedReader(new FileReader("in.txt"));     BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"))) {    // código} catch (IOException e) {    System.err.println("Error de E/S: " + e.getMessage());}

Blogs

Book Recommendations