17.4. Manejo de excepciones y jerarquía de excepciones en Java
El manejo de excepciones es un aspecto fundamental de la programación Java. Una excepción es un evento que ocurre durante la ejecución de un programa y que interrumpe el flujo normal de instrucciones. El mecanismo de excepción en Java proporciona una manera de separar el código de manejo de errores del código normal y permite que un método devuelva información sobre los problemas que ocurren durante la ejecución.
Tipos de excepciones en Java
En Java, las excepciones se dividen en dos categorías principales: excepciones comprobadas y excepciones no comprobadas.
Excepciones marcadas
excepciones marcadas son aquellas que el compilador requiere que sean manejadas o declaradas en el método que las genera. Se utilizan para problemas que el programador debe anticipar y manejar adecuadamente, generalmente son problemas fuera del control del programa, como problemas de E/S (Entrada/Salida), fallas de red, etc. Ejemplos de excepciones marcadas incluyen IOException
, SQLException
y ClassNotFoundException
.
Excepciones no comprobadas
Lasexcepciones no marcadas incluyen las subclases de Error
y RuntimeException
. Estas son excepciones que el compilador no requiere que sean manejadas o declaradas, y generalmente son el resultado de errores en el código mismo, como acceder a un índice fuera de los límites de una matriz (ArrayIndexOutOfBoundsException
) o intentar acceder a un objeto a través de una referencia nula (NullPointerException
).
Jerarquía de excepciones en Java
La clase base para todas las excepciones en Java es Throwable
. De él se derivan dos subclases importantes: Error
y Exception
. La clase Error
está diseñada para situaciones que normalmente no se espera que su programa detecte o maneje, como OutOfMemoryError
o StackOverflowError
. La clase Exception
es la base de todas las excepciones que se pueden manejar y tiene dos categorías principales: excepciones marcadas y excepciones no marcadas, como se mencionó anteriormente.
Manejo de excepciones
El manejo de excepciones en Java se realiza a través de los bloques try
, catch
y finally
. El bloque try
contiene el código que puede generar una excepción, mientras que el bloque catch
se usa para detectar y manejar la excepción. El bloque finally
, que es opcional, contiene código que siempre se ejecuta después del bloque try
, independientemente de si se lanzó una excepción o no.
intentar { // código que puede generar una excepción } captura (ExcecaoType1 e) { // tratamiento para TypeExcecao1 } captura (ExceptionType2 e) { // tratamiento para TypeExcecao2 } finalmente { // código que siempre se ejecuta después del bloque try, con o sin excepciones }
Es posible capturar múltiples excepciones en un solo bloque catch
usando el operador de canalización (|). Esto es útil cuando el mismo bloque de código puede generar diferentes excepciones, pero el manejo de todas son iguales.
intentar { // código que puede generar diferentes excepciones } captura (TipoExcecao1 | TipoExcecao2 e) { // tratamiento común para TypeExcecao1 y TypeExcecao2 }
Propagación de excepciones
Cuando se lanza una excepción y no se detecta en el mismo método, se propaga hacia la pila de llamadas al método hasta que encuentra un bloque catch
que pueda manejarla. Si no se encuentra ningún bloque catch
adecuado, el programa finaliza y se imprime la pila de llamadas, lo que ayuda a diagnosticar el problema.
Buenas prácticas en el manejo de excepciones
Cuando se trata de excepciones, es importante seguir algunas buenas prácticas:
- Maneja únicamente las excepciones que realmente puedas manejar.
- Evite detectar
Throwable
,Exception
oRuntimeException
a menos que sea absolutamente necesario, ya que esto puede detectar excepciones imprevistas y ocultar errores. - No utilice excepciones para el control de flujo en su programa.
- Proporcione mensajes de error útiles y detallados.
- Limpiar recursos en un bloque
finally
o utilizar la función de prueba con recursos desde Java 7 en adelante para garantizar que los recursos se cierren automáticamente después de su uso.
El manejo eficaz de excepciones es esencial para crear programas sólidos y confiables. Al comprender los tipos de excepciones, la jerarquía de excepciones y las mejores prácticas, estará bien equipado para enfrentar los desafíos que surgen al programar en Java.