17.7 Manejo de excepciones y jerarquía de excepciones en Java
El manejo de excepciones es un aspecto fundamental en la programación Java, ya que permite que un programa reaccione apropiadamente ante condiciones inesperadas durante la ejecución. Las excepciones en Java son objetos que representan situaciones anormales que pueden ocurrir durante la ejecución de un programa. Al comprender la jerarquía de excepciones y aprender a manejarlas correctamente, los programadores pueden crear aplicaciones más sólidas y confiables.
Jerarquía de excepciones en Java
En Java, todas las excepciones son descendientes de la clase Throwable
. Esta clase se divide en dos subclases principales: Error
y Exception
. La clase Error
se utiliza para situaciones de error graves que la aplicación normalmente no debería intentar manejar, como problemas de la máquina virtual Java (JVM). La clase Exception
es la que nos interesa para manejar excepciones, ya que incluye todas las excepciones que una aplicación puede querer manejar.
Las excepciones de la clase Exception
se dividen en dos categorías: excepciones marcadas y excepciones no marcadas. Las excepciones marcadas son aquellas que el compilador requiere que se manejen o declaren en la firma del método. Los ejemplos incluyen IOException
y SQLException
. Los no marcados, una subclase de RuntimeException
, no necesitan ser tratados ni declarados explícitamente. Ejemplos comunes son NullPointerException
y IndexOutOfBoundsException
.
Métodos y la cláusula lanzamientos
Cuando un método puede lanzar una excepción que no maneja, debe declarar esta posibilidad usando la cláusula throws
en su firma. Esto es obligatorio para las excepciones marcadas, pero opcional para las excepciones no marcadas. La cláusula throws
informa al llamador del método que debe estar preparado para manejar esta excepción o, alternativamente, propagarla.
public void myMethod() lanza IOException { // Código que puede generar una IOException }
Si el método myMethod
anterior genera una IOException
, no necesita manejar esta excepción internamente; en cambio, lo propaga al método que lo llamó. Este método de llamada necesita entonces manejar la excepción o también declararla en su firma con la cláusula throws
.
Manejo de excepciones con try-catch
Para manejar excepciones, utilizamos los bloques try
y catch
. El bloque try
contiene el código que puede generar una excepción, mientras que el bloque catch
contiene el código que se ejecuta si se produce una excepción. Podemos tener múltiples bloques catch
para manejar diferentes tipos de excepciones.
intentar { // Código que puede generar excepciones } captura (IOException e) { // Código para manejar IOException } captura (SQLException e) { // Código para manejar SQLException }
Es importante tener en cuenta que los bloques catch
deben seguir el orden de especificidad, desde el más específico hasta el más genérico, porque una vez que un bloque catch
, los bloques siguientes no se evalúan.
cláusula finalmente
También existe la cláusula finally
, que es opcional y sigue a los bloques try-catch
. El código dentro del bloque finally
se ejecuta independientemente de si se produce una excepción o no, lo que lo hace útil para ejecutar código de limpieza, como cerrar conexiones o liberar recursos.
intentar { // Código que puede generar excepciones } captura (Excepción e) { // Código para manejar excepciones } finalmente { // Código siempre ejecutado después de intentar o capturar }
Propagación de excepciones
A veces puede ser deseable o necesario propagar una excepción para que pueda manejarse en otro lugar. Esto se hace simplemente no detectando la excepción en un bloque catch
o arrojándola nuevamente dentro de un bloque catch
usando la palabra clave throw
.
public void myMethod() lanza IOException { intentar { // Código que puede generar una IOException } captura (IOException e) { // Puedes hacer algo con la excepción y lanzarlo nuevamente tirar e; } }
Excepciones personalizadas
Los desarrolladores también pueden crear sus propias excepciones personalizadas extendiendo la clase Exception
(para excepciones marcadas) o RuntimeException
(para excepciones no marcadas). Esto es útil cuando desea crear excepciones específicas para los casos de uso de su aplicación.
la clase pública MinhaExcecao extiende la excepción { público MinhaExcecao (mensaje de cadena) { sorberer(mensaje); } }
En resumen, el manejo de excepciones en Java es una herramienta poderosa para crear programas robustos y confiables. Al comprender la jerarquía de excepciones y saber cómo declarar, lanzar y manejar excepciones, puede asegurarse de que su programa maneje situaciones inesperadas de manera controlada.