Cómo manejar las excepciones de java de la manera correcta
Como novato de programación, el concepto de manejo de excepciones puede ser difícil de envolver su cabeza alrededor. No es que el concepto en sí es difícil, pero la terminología puede hacer que parezca más avanzada de lo que es. Y es una característica tan poderosa que es propenso al mal uso y el abuso.Cómo aprender programación sin todo el estrésCómo aprender programación sin todo el estrésTal vez usted ha decidido llevar a cabo la programación, ya sea para una carrera o simplemente como un hobby. ¡Estupendo! Pero tal vez usted está comenzando a sentirse abrumado. No muy bien. Aquí está la ayuda para facilitar su viaje.Lee mas
En este artículo, usted aprenderá lo que son excepciones, por qué son importantes, cómo usarlos, y los errores comunes a evitar. La mayoría de las lenguas modernas tener algún tipo de control de excepciones, por lo que si nunca pasar de Java, se puede tomar la mayor parte de estos consejos con usted.
La comprensión de excepciones de Java
En Java, una excepción es un objeto que indica que algo anormal (o “excepcional”) ocurrieron durante la ejecución de la aplicación. Tales excepciones son lanzado, que básicamente significa un objeto de excepción se crea (similar a cómo los errores son “criados”).
La belleza es que se puede captura excepciones lanzadas, que le permite hacer frente a la condición anormal y permite que su aplicación siga funcionando como si nada salió mal. Por ejemplo, mientras que un puntero nulo en C se puede bloquear su aplicación, Java le permite lanzar y atrapar Excepción de puntero nulo
s antes de una variable nula tiene la oportunidad de causar un accidente.
Recuerde, una excepción es sólo un objeto, pero con una característica importante: se debe extenderse desde la Excepción
clase o subclase de cualquier Excepción
. Mientras que Java tiene todo tipo de excepciones incorporadas, también puede crear su propio 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
Así que lo que sucede cuando se lanza una excepción?
En primer lugar, Java busca dentro del método inmediato para ver si hay código que gestiona el tipo de excepción que tiró. Si no existe un manipulador, se ve en el método que llama el método actual para ver si existe un mango allí. Si no es así, se ve en 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 la pila y luego se bloquea. (En realidad es más matizada que simplemente estrellarse, pero eso es un tema avanzado más allá del alcance de este artículo).
UN seguimiento de la pila es una lista de todos los métodos que Java atravesaba en la búsqueda de un manejador de excepciones. Esto es lo que un seguimiento de pila se ve así:
Excepción en hilo "principal" Java.lang.NullPointerExceptionat com.ejemplo.mi proyecto.Libro.getTitle(Libro.Java:dieciséis)en com.ejemplo.mi proyecto.Autor.getBookTitles(Autor.Java:25)en com.ejemplo.mi proyecto.Oreja.principal(Oreja.Java:14)
Podemos deducir mucho de esto. En primer lugar, la excepción lanzada era una Excepción de puntero nulo
. Se le 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 se puede ver, sabiendo todo esto hace más fácil la depuración.
Pero, de nuevo, el verdadero beneficio de excepciones es que se puede “manejar” la condición anormal por la captura de la excepción, el establecimiento de las cosas bien, y la reanudación de la solicitud sin que se caiga.
Uso de excepciones de Java en Código
Digamos que usted tiene algunMetodo ()
que toma un número entero y ejecuta una lógica que puede romperse si el entero es menor que 0 o mayor que 100. Esto podría ser un buen lugar para lanzar una excepción:
Vídeo: try, catch y finally (Manejo de excepciones) - Tutorial Java
público vacío algunMetodo(int valor) {Si (valor lt; 0 || valor gt; 100) {lanzar nuevo Argumento de excepción ilegal()-}// ...}
Con el fin de detectar esta excepción, tiene que ir a donde algunMetodo ()
se llama y el uso de la try-catch bloque:
público vacío callingMethod() {tratar {algunMetodo(200)-someOtherMethod()-} captura (Argumento de excepción ilegal mi) {// manejar la excepción aquí}// ...}
Todo dentro de la tratar bloque se ejecutará en orden hasta que se produce una excepción. Tan pronto como se produce una excepción, todas las declaraciones posteriores se omiten y la lógica de la aplicación se dirige de inmediato a la captura bloquear.
En nuestro ejemplo, entramos en el bloque try e inmediatamente llamamos algunMetodo ()
. Desde 200 no es entre 0 y 100, una Argumento de excepción ilegal
es aventado. Esto termina inmediatamente la ejecución de algunMetodo ()
, se salta el resto de la lógica en el bloque try (someOtherMethod ()
nunca es llamado), y reanuda la ejecución dentro del bloque catch.
¿Qué pasaría si llamamos algunMetodo (50)
¿en lugar? los Argumento de excepción ilegal
nunca sería lanzado. algunMetodo ()
ejecutaría de forma normal. El bloque try ejecutaría de forma normal, llamando someOtherMethod ()
cuando algunMetodo () finaliza. Cuando someOtherMethod ()
fines, el bloque catch sería omiten y callingMethod ()
continuaría.
Tenga en cuenta que puede tener varios bloques de captura por bloque try:
público vacío callingMethod() {tratar {algunMetodo(200)-someOtherMethod()-} captura (Argumento de excepción ilegal mi) {// manejar la excepción aquí} captura (Excepción de puntero nulo mi) {// manejar la excepción aquí}// ...}
También tenga en cuenta que un opcional finalmente bloque existe así:
público vacío método() {tratar {// ...} captura (Excepción mi) {// ...} finalmente {// ...}}
El código dentro de un bloque finally es siempre ejecutado sin importar qué. Si usted tiene una sentencia return en el bloque try, el bloque finally se ejecuta antes de regresar a cabo del método. Si se lanza otra excepción en el bloque catch, el bloque finally se ejecuta antes de que se produce la excepción.
Debe utilizar el bloque finally cuando tienes objetos que necesitan ser limpiado antes de que termine el método. Por ejemplo, si se abre un archivo en el bloque try y más tarde inició una excepción, el bloque finally le permite cerrar el archivo antes de salir del método.
Tenga en cuenta que usted puede tener un bloque finally sin un bloque catch:
público vacío método() {tratar {// ...} finalmente {// ...}}
Esto le permite hacer cualquier limpieza necesaria al tiempo que permite excepciones lanzadas para propagar la pila de invocación de método (es decir, que no desea manejar la excepción aquí, pero que todavía tienen que limpiar primero).
Comprobado frente a excepciones no comprobadas en Java
A diferencia de la mayoría de los lenguajes, Java distingue entre excepciones comprobadas y excepciones sin marcar (Por ejemplo, C # solamente tiene excepciones sin marcar). Una excepción comprobada debe quedar atrapados en el método en el que se produce la excepción o de lo contrario el código no se compilará.
Para crear una excepción comprobada, se extienden desde Excepción
. Para crear una excepción sin control, se extienden desde Excepción en tiempo de ejecución
.
Cualquier método que lanza una excepción comprobada debe indicar esto en la firma del método mediante el lanza palabra clave. Desde incorporado en Java IOException
es una excepción comprobada, el siguiente código no se compilará:
público vacío wontCompile() {// ...Si (somecondition) {lanzar nuevo IOException()-}// ...}
Primero debe declarar que lanza una excepción comprobada:
público vacío willCompile() lanza IOException {// ...Si (somecondition) {lanzar nuevo IOException()-}// ...}
Tenga en cuenta que un método puede ser declarado como una excepción, pero en realidad nunca una excepción. Aún así, todavía tendrá que ser capturados o de lo contrario el código no se compilará la excepción.
Cuándo se debe usar facturado o excepciones sin marcar?
La documentación oficial de Java tiene una página en esta pregunta. Se resume la diferencia con una regla del pulgar sucinta: “Si un cliente puede esperar razonablemente para recuperarse de una excepción, que sea una excepción comprobada. Si un cliente no puede hacer nada para recuperarse de la excepción, que sea una excepción no comprobada “.
Pero esta pauta puede ser obsoleta. Por un lado, las excepciones comprobadas hacen resultado en el código más robusto. Por otra parte, ningún otro lenguaje ha comprobado excepciones de la misma manera como Java, que muestra dos cosas: una, la función no es lo suficientemente útil para otros idiomas robarlo, y dos, que puede absolutamente vivo sin ellos. Además, comprueban excepciones no se llevan bien con las expresiones lambda introducidas en Java 8.10 consejos para el limpiador de escritura & mejor Código10 consejos para el limpiador de escritura & mejor CódigoEscribir código limpio parece más fácil de lo que realmente es, pero los beneficios valen la pena. He aquí cómo usted puede comenzar a escribir código más limpio hoy.Lee mas
Directrices para Java excepciones de uso
Las excepciones son útiles pero fácilmente mal uso y el abuso. Aquí hay algunos consejos y las mejores prácticas para ayudar a evitar hacer un lío de ellos.
- Prefiero excepciones específicas a las excepciones generales. Utilizar
NumberFormatException
encimaArgumento de excepción ilegal
cuando sea posible, de otro modo utilizarArgumento de excepción ilegal
encimaExcepción en tiempo de ejecución
cuando sea posible. - Nunca coger
throwable
! losExcepción
clase extiende realidadthrowable
, y el bloque catch en realidad trabaja conthrowable
o cualquier clase que se extiende Throwable. sin embargo, elError
clase también se extiendethrowable
, y que nunca se desea capturar unaError
porqueError
s indicar problemas graves irrecuperables. - Nunca coger
Excepción
!InterruptedException
se extiendeExcepción
, por lo que cualquier bloque que llamaExcepción
También se pondrá al díaInterruptedException
, y eso es una excepción muy importante que usted no quiere meterse con (sobre todo en aplicaciones multi-hilo) a menos que sepa lo que está haciendo. Si usted no sabe qué excepción para ponerse en su lugar, considerar no pescar nada. - Utilizar mensajes descriptivos para facilitar la depuración. Cuando se lanza una excepción, puede proporcionar una
Cuerda
mensaje como un argumento. Este mensaje se puede acceder en el bloque catch utilizando elException.getMessage ()
método, pero si la excepción no es capturado, el mensaje también aparecerá como parte del seguimiento de la pila. - Trate de no coger y hacer caso omiso excepciones. Para moverse por la inconveniencia de excepciones comprobadas, una gran cantidad de novatos y programadores perezosos establecerá un bloque catch, pero dejarlo vacío. ¡Malo! Siempre maneje con gracia, pero si no puede, por lo menos imprimir un seguimiento de la pila para que sepa la excepción fue lanzada. Para ello, puede utilizar el
Excepcion.printStackTrace ()
método. - Cuidado con el uso excesivo de excepciones. Cuando usted tiene un martillo, todo parece un clavo. La primera vez que aprender acerca de las excepciones, es posible que se sienta obligado a convertir todo en una excepción ... hasta el punto donde la mayoría de flujo de control de la aplicación se reduce a la gestión de excepciones. Recuerde, las excepciones son para ocurrencias “excepcionales”!
Ahora usted debe ser lo suficientemente cómodo con excepciones para entender lo que son, por qué se van a usar, y cómo incorporarlos a su propio código. Si no se entiende completamente el concepto, está bien! Me tomó un rato para que “clic” en la cabeza, por lo no se siente como que necesita para acometerlo. Tome su tiempo.6 Señales de que usted no pretende ser un programador6 Señales de que usted no pretende ser un programadorNo todo el mundo está hecho para ser un programador. Si usted no está completamente seguro de que está destinado a ser un programador, aquí hay algunos signos que pueden apuntar en la dirección correcta.Lee mas
Vídeo: 027.- Curso de Java. Manejar errores y excepciones.
¿Tienes alguna pregunta? Sabe de cualquier otros consejos relacionados con la excepción de que me perdí? Compartirlas en los comentarios!