Cosas a evitar con las excepciones de Java

Las excepciones son un sistema poderoso para interrumpir el flujo de ejecución del programa ante una situación excepcional, pero si acabas de llegar al lenguaje debes saber cómo actuar y cómo NO actuar, para evitar que tu código se vuelva frágil.

Cuando trabajamos con excepciones en Java, es fundamental evitar ciertos errores comunes que pueden complicar el manejo de errores y la claridad de nuestro código. Aunque la sintaxis básica de excepciones en Java es sencilla —con throw, try, catch, finally y la declaración de throws— hay detalles que pueden marcar una gran diferencia en la robustez y mantenibilidad de nuestras aplicaciones.

Un error importante que debemos evitar es usar un return dentro del bloque finally. Aunque es legal en Java, poner un return en finally tiene un efecto inesperado: anula cualquier excepción que se haya lanzado previamente en el bloque try o catch. Por ejemplo, si dentro de un catch lanzamos una excepción con throw y luego en el finally hay un return, la excepción queda comida y el método devolverá el valor del return en lugar de propagar el error. Esto puede hacer que nuestro programa no falle cuando debería, ocultando problemas que deberían ser visibles y tratados. Por eso, si tenemos una variable que devolvemos en el return del finally, debemos asegurarnos de que no estamos inadvertidamente suprimiendo excepciones importantes.

Otro error frecuente es utilizar directamente las excepciones genéricas como Exception o RuntimeException. En lugar de eso, es mucho mejor usar subclases específicas que representen el tipo concreto de error que queremos manejar. La jerarquía de excepciones en Java está diseñada para que cada situación anómala tenga su propia clase, lo que nos permite identificar con precisión la causa del fallo sin tener que analizar mensajes o campos adicionales. Por ejemplo, lanzar un SQLException nos indica claramente que el problema está relacionado con la base de datos, mientras que un NullPointerException señala un error distinto. Usar excepciones específicas facilita escribir código que trate cada tipo de error de forma adecuada y diferenciada, algo que no es posible si capturamos o lanzamos solo Exception o RuntimeException.

Finalmente, es importante no confundir el uso de RuntimeException con el de Exception. Aunque puede ser tentador usar RuntimeException para evitar tener que declarar excepciones en la firma del método o usar bloques try-catch, estas dos categorías tienen propósitos distintos. Las excepciones que extienden de Exception (checked exceptions) representan errores graves y situaciones externas que deben ser manejadas explícitamente, mientras que las RuntimeException suelen indicar errores de programación, como un mal uso de una API. Si envolvemos errores graves en RuntimeException para simplificar el código, corremos el riesgo de que quien use nuestro código no sepa que debe manejar esas excepciones, lo que puede dificultar la detección y corrección de bugs. Por eso, aunque pueda parecer que el código queda más limpio sin checked exceptions, estas están ahí para ayudarnos a conocer todas las posibles causas de fallo y a tratarlas adecuadamente.

Además, conviene recordar que throw y throws no deben usarse como si fueran un return. Las excepciones están pensadas para comunicar situaciones excepcionales y anómalas, no para devolver valores alternativos en el flujo normal del programa. Si nuestro método puede devolver diferentes tipos de objetos, no debemos usar excepciones para simular esa funcionalidad.

En definitiva, manejar bien las excepciones en Java implica evitar return en finally, usar subclases específicas de excepciones en lugar de las genéricas, y respetar la diferencia entre RuntimeException y Exception. Así, nuestro código será más claro, robusto y fácil de mantener.

Lista de reproducción
  1. 1
    Introducción a las excepciones en Java
    12 minutos
  2. 2
    throw y throws, usos y diferencias
    10 minutos
  3. 3
    ¿Qué diferencias hay entre Exception y RuntimeException?
    9 minutos
  4. 4
    La palabra clave finally en Java
    6 minutos
  5. 5
    Cosas a evitar con las excepciones de Java
    6 minutos