Cómo manejar las excepciones de Java de la manera correcta
Como novato en la programación Cómo aprender a programar sin todo el estrés Cómo aprender a programar sin todo el estrés Tal vez haya decidido dedicarse a la programación, ya sea para una carrera o simplemente como pasatiempo. ¡Genial! Pero tal vez estás empezando a sentirte abrumado. No muy bien. Aquí hay ayuda para facilitar su viaje. Leer más, el concepto de manejo de excepciones Puede ser difícil envolver la cabeza. No es que el concepto en sí sea difícil, pero la terminología puede hacer que parezca más avanzado de lo que es. Y es una característica tan poderosa que es propensa al mal uso y abuso..
En este artículo, aprenderá qué son las excepciones, por qué son importantes, cómo usarlas y cómo evitar errores comunes. Lenguajes más modernos 6 Lenguajes de programación más fáciles de aprender para principiantes 6 Lenguajes de programación más fáciles de aprender para principiantes Aprender a programar consiste en encontrar el lenguaje correcto tanto como en el proceso de edificación. Aquí están los seis lenguajes de programación más fáciles para principiantes. Obtenga más información sobre el manejo de la excepción, así que si alguna vez pasa de Java 7 Trucos útiles para dominar un nuevo lenguaje de programación 7 Trucos útiles para dominar un nuevo lenguaje de programación Está bien sentirse abrumado cuando está aprendiendo a codificar. Probablemente olvidará las cosas tan rápido como las aprende. Estos consejos pueden ayudarlo a conservar mejor toda la información nueva. Lea más, puede llevar la mayoría de estos consejos con usted..
Entendiendo las excepciones de Java
En Java, un excepción es un objeto que indica algo anormal (o “excepcional”) ocurrió durante la ejecución de su aplicación. Tales excepciones son arrojado, lo que básicamente significa que se crea un objeto de excepción (similar a cómo se cometen los errores). “elevado”).
La belleza es que puedes captura ha lanzado excepciones, que le permiten lidiar con la condición anormal y permitir que su aplicación continúe ejecutándose como si nada hubiera salido mal. Por ejemplo, mientras que un puntero nulo en C podría bloquear su aplicación, Java le permite lanzar y atrapar Excepción de puntero nulo
s antes de que una variable nula tenga la posibilidad de causar una caída.
Recuerde, una excepción es solo un objeto, pero con una característica importante: debe extenderse desde el Excepción
clase o cualquier subclase de Excepción
. Si bien Java tiene todo tipo de excepciones incorporadas, también puede crear las suyas propias si lo desea. Algunas de las excepciones de Java más comunes incluyen:
Excepción de puntero nulo
NumberFormatException
Argumento de excepción ilegal
Excepción en tiempo de ejecución
IllegalStateException
Entonces, ¿qué pasa cuando lanzas una excepción??
Primero, Java busca en el método inmediato para ver si hay un código que maneje el tipo de excepción que lanzó. Si un manejador no existe, mira el método que llamó al método actual para ver si existe un manejador allí. Si no, mira el método que llama ese Método, y luego el siguiente método, etc.. Si la excepción no se detecta, la aplicación imprime un seguimiento de pila y luego se bloquea. (En realidad, es más matizado que simplemente fallar, pero ese es un tema avanzado que va más allá del alcance de este artículo).
UNA traza de pila es una lista de todos los métodos que Java atravesó mientras buscaba un controlador de excepciones. Así es como se ve una traza de pila:
Excepción en el hilo "main" java.lang.NullPointerException en com.example.myproject.Book.getTitle (Book.java:16) en com.example.myproject.Author.getBookTitles (Author.java:25) en com.example. myproject.Bootstrap.main (Bootstrap.java:14)
Podemos deducir mucho de esto. Primero, la excepción lanzada fue un Excepción de puntero nulo
. Ocurrió en el getTitle ()
Método en la línea 16 de Book.java. Ese método fue llamado desde getBookTitles ()
en la línea 25 de Author.java. Ese método fue llamado desde principal()
en la línea 14 de Bootstrap.java. Como puede ver, saber todo esto facilita la depuración.
Pero una vez más, el verdadero beneficio de las excepciones es que puedes “encargarse de” la condición anormal al capturar la excepción, configurar correctamente las cosas y reanudar la aplicación sin fallar.
Usando las excepciones de Java en el código
Digamos que tienes algún Método ()
eso toma un entero y ejecuta una lógica que podría romperse si el entero es menor que 0 o mayor que 100. Este podría ser un buen lugar para lanzar una excepción:
public void someMethod (int value) if (value < 0 || value > 100) lanzar nuevo Argumento de excepción ilegal
(); //…
Para poder capturar esta excepción, debe ir a donde algún Método ()
se llama y usa el bloque try-catch:
void publicMethod () try someMethod (200); someOtherMethod (); catch (IllegalArgumentException e) // maneja la excepción aquí // ...
Todo dentro de la tratar el bloque se ejecutará en orden hasta que se lance una excepción. Tan pronto como se lanza una excepción, todas las declaraciones subsiguientes se omiten y la lógica de la aplicación salta inmediatamente al captura bloquear.
En nuestro ejemplo, ingresamos al bloque try y llamamos inmediatamente algún Método ()
. Como 200 no es entre 0 y 100, un Argumento de excepción ilegal
es aventado. Esto termina inmediatamente la ejecución de algún Método ()
, omite el resto de la lógica en el bloque try (algún otro método ()
nunca se llama), y reanuda la ejecución dentro del bloque catch.
¿Qué pasaría si llamáramos? algún Método (50)
¿en lugar? los Argumento de excepción ilegal
nunca sería arrojado. algún Método ()
ejecutaría como normal. El bloque try se ejecutaría normalmente, llamando algún otro método ()
cuando algún Método () se completa. Cuando algún otro método ()
termina, el bloque catch se saltaría y método de llamada ()
continuaría.
Tenga en cuenta que puede tener varios bloques catch por bloque try:
void publicMethod () try someMethod (200); someOtherMethod (); catch (IllegalArgumentException e) // maneja la excepción aquí catch (NullPointerException e) // maneja la excepción aquí // ...
También tenga en cuenta que un opcional finalmente El bloque también existe:
método de anulación público () intentar // ... captura (Excepción e) // ... finalmente // ...
El código dentro de un bloque final es siempre ejecutado pase lo que pase Si tiene una declaración de retorno en el bloque try, el bloque finally se ejecuta antes de salir del método. Si lanza otra excepción en el bloque catch, el bloque finally se ejecuta antes de que se lance la excepción.
Debe usar el bloque finally cuando tenga objetos que deban limpiarse antes de que finalice el método. Por ejemplo, si abrió un archivo en el bloque de prueba y luego lanzó una excepción, el bloque finalmente le permite cerrar el archivo antes de abandonar el método..
Tenga en cuenta que puede tener un bloque finally sin un bloque catch:
método de vacío público () intentar // ... finalmente // ...
Esto le permite realizar la limpieza necesaria mientras permite que las excepciones lanzadas propaguen la pila de invocación del método (es decir, no desea manejar la excepción aquí pero aún necesita limpiar primero).
Excepciones marcadas vs. no verificadas en Java
A diferencia de la mayoría de los lenguajes, Java distingue entre excepciones verificadas y excepciones sin marcar (por ejemplo, C # solo tiene excepciones sin marcar). Una excepción comprobada debe ser atrapado en el método donde se lanza la excepción o el código no compilará.
Para crear una excepción marcada, extienda desde Excepción
. Para crear una excepción sin marcar, extienda desde Excepción en tiempo de ejecución
.
Cualquier método que lance una excepción marcada debe denotar esto en la firma del método usando el arroja palabra clave. Desde Java incorporado IOException
es una excepción marcada, el siguiente código no compilará:
public void wontCompile () //… if (someCondition) lanza una nueva IOException (); //…
Primero debe declarar que lanza una excepción marcada:
public void willCompile () lanza IOException //… if (someCondition) lanza una nueva IOException (); //…
Tenga en cuenta que un método puede ser declarado como lanzando una excepción, pero en realidad nunca lanza una excepción. Aun así, la excepción deberá ser capturada o el código no se compilará.
¿Cuándo debería usar excepciones marcadas o no marcadas??
La documentación oficial de Java tiene una página sobre esta cuestión. Resume la diferencia con una breve regla de oro: “Si se puede esperar razonablemente que un cliente se recupere de una excepción, conviértalo en una excepción comprobada. Si un cliente no puede hacer nada para recuperarse de la excepción, conviértalo en una excepción sin marcar.”
Pero esta directriz puede estar desactualizada. Por un lado, las excepciones comprobadas dan como resultado un código más sólido. 10 Consejos para escribir un código más limpio y mejor. 10 Consejos para escribir un código más limpio y mejor. Escribir un código limpio parece más fácil de lo que realmente es, pero los beneficios valen la pena. Aquí es cómo puedes comenzar a escribir un código más limpio hoy. Lee mas . Por otro lado, ningún otro idioma ha marcado las excepciones de la misma manera que Java, lo que muestra dos cosas: una, la función no es lo suficientemente útil para que otros idiomas la roben, y dos, puedes vivir sin ellas. Además, las excepciones comprobadas no se reproducen bien con las expresiones lambda introducidas en Java 8.
Pautas para el uso de excepciones de Java
Las excepciones son útiles pero fácilmente mal utilizadas y abusadas. Aquí hay algunos consejos y mejores prácticas para ayudarlo a evitar hacer un lío de ellos..
- Prefiere excepciones específicas a excepciones generales. Utilizar
NumberFormatException
terminadoArgumento de excepción ilegal
cuando sea posible, de lo contrario useArgumento de excepción ilegal
terminadoExcepción en tiempo de ejecución
cuando sea posible. - Nunca atrapar
Tirable
! losExcepción
la clase en realidad se extiendeTirable
, y el bloque de captura realmente funciona conTirable
o cualquier clase que extienda Throwable. sin embargo, elError
la clase también se extiendeTirable
, y nunca quieres coger unError
porqueError
s indican serios problemas irrecuperables. - Nunca atrapar
Excepción
!Excepción interrumpida
se extiendeExcepción
, así que cualquier bloque que atrapeExcepción
también atraparáExcepción interrumpida
, y esa es una excepción muy importante con la que no quiere meterse (especialmente en aplicaciones de subprocesos múltiples) a menos que sepa lo que está haciendo. Si no sabe qué excepción capturar, considere no capturar nada. - Usa mensajes descriptivos para facilitar la depuración.. Cuando lanzas una excepción, puedes proporcionar un
Cuerda
mensaje como argumento. Se puede acceder a este mensaje en el bloque catch usando elException.getMessage ()
método, pero si la excepción nunca se detecta, el mensaje también aparecerá como parte del seguimiento de la pila. - Intenta no atrapar e ignorar las excepciones.. Para evitar el inconveniente de las excepciones comprobadas, muchos programadores novatos y perezosos establecerán un bloque catch pero lo dejarán vacío. ¡Malo! Manéjelo siempre con gracia, pero si no puede, al menos imprima un seguimiento de pila para que sepa que se lanzó la excepción. Puedes hacer esto usando el
Exception.printStackTrace ()
método. - Cuidado con el uso excesivo de excepciones. Cuando tienes un martillo, todo parece un clavo. Cuando se entera de las excepciones, puede sentirse obligado a convertir todo en una excepción ... hasta el punto en que la mayor parte del flujo de control de su aplicación se reduce al manejo de excepciones. Recuerde, las excepciones son para “excepcional” ocurrencias!
Ahora debería sentirse lo suficientemente cómodo con las excepciones para entender qué son, por qué se usan y cómo incorporarlos a su propio código. Si no entiendes completamente el concepto, ¡está bien! Me tomó un tiempo para que “hacer clic” en mi cabeza, así que no siento que necesites apresurarte. 6 Señales de que no estás destinado a ser programador. 6 Señales de que no estás destinado a ser programador. Si no está completamente seguro de estar destinado a ser un programador, aquí hay algunas señales que pueden indicar la dirección correcta. Lee mas . Tome su tiempo.
¿Tienes alguna pregunta? ¿Conoces algún otro consejo relacionado con la excepción que me haya perdido? Compártelos en los comentarios a continuación.!
Explorar más sobre: Java.