Excepciones de Java ¿Las estás manejando bien?

Excepciones de Java ¿Las estás manejando bien? / Programación

Una excepción en la programación significa una condición excepcional en algún punto de la ejecución del programa. Se utiliza cuando la condición excepcional se puede manejar mejor en otro lugar que en el lugar donde se encuentra. Considere los siguientes ejemplos:

  • El hecho de no abrir un archivo de configuración puede manejarse mejor más arriba en el código, tal vez utilizando una ubicación de archivo de configuración alternativa.
  • Cómo acceder a un elemento de la matriz Cómo usar una lista de arreglos de Java Cómo usar una lista de arreglos de Java Un arraylist de Java es una matriz que se puede cambiar de tamaño para propósitos generales. Proporciona la mayoría de las instalaciones generalmente esperadas de matrices en otros idiomas. En este artículo, aprenderá a configurar y utilizar un arraylist. Leer más fuera de los límites de la matriz significa un error de programa. Feliz depuración!
  • Se debe enviar un error de análisis XML a la notificación del usuario para que se pueda corregir el archivo XML..
  • El programa que se está quedando sin memoria (tal vez cuando se procesa un archivo grande) se puede rectificar quizás aumentando la cantidad de memoria disponible para el proceso Java.

En todos estos casos (y más), la excepción debe manejarse fuera de la ubicación donde se genera para que se pueda abordar la causa subyacente.

Tipos de excepciones

La imagen de abajo muestra las partes principales de la Jerarquía de excepciones de Java. La clase base es Tirable que está subclasificado en Excepción y Error. Clase Excepción es para condiciones relacionadas con el programa que las aplicaciones pueden detectar en un intento de salvar la situación. Clase Error, por otro lado, es para indicar errores graves en el entorno de tiempo de ejecución de Java que las aplicaciones no deben detectar. Algunos ejemplos son: Error de memoria insuficiente y StackOverflowError.

Un Excepción Una vez más es de dos tipos: marcado y sin marcar. Una excepción marcada debe ser manejada por el código que llama. Esta regla es impuesta por el compilador java. Una excepción no verificada, por otro lado, puede propagarse a lo largo de la cadena de llamadas sin tener que declararla explícitamente. Los siguientes ejemplos aclararán.

Excepciones comprobadas

El siguiente método intenta crear FileReader de un archivo. El constructor lanza una excepción marcada. FileNotFoundException El cual debe ser manejado por el código de llamada o declarado como arrojado..

El siguiente código no compilar ya que no hace ni.

private void loadFile (nombre de archivo de cadena) FileReader in = new FileReader (nombre de archivo);  

Una forma de obtener el código para compilar es manejar la excepción (ver más abajo).

private void loadFile (String filename) try FileReader in = new FileReader (filename));  captura (ex FileNotFoundException) // maneja la excepción aquí 

Si la excepción no puede ser manejada directamente por la persona que llama, debe ser declarada en la firma del método.

private void loadFile (String filename) lanza java.io.FileNotFoundException FileReader in = new FileReader (filename));  

Excepciones no verificadas

Una excepción no verificada es una subclase de Excepción en tiempo de ejecución y no necesita ser manejado directamente o declarado como arriba. Por ejemplo, el siguiente código resulta en una Excepción de puntero nulo, que es un tipo de Excepción en tiempo de ejecución. El código, sin embargo, compila sin error ya que Excepción de puntero nulo es una excepción sin marcar.

private void handleEvent () String name = null; if (name.length ()> 0)  

Envolviendo excepciones

Dada la discusión anterior sobre las excepciones marcadas y no comprobadas, parece que es más fácil lidiar con las excepciones no verificadas ya que no tiene que declararlas o manejarlas usted mismo. Con esa comodidad en mente, a veces puede ser útil envolver una excepción marcada en una excepción no verificada.

El siguiente ejemplo de código muestra cómo envolver una excepción. El método Método 1() lanza un SQLException en su cuerpo. Para que el código se compile correctamente, la excepción debe ser declarada como lanzada.

private void method_1 () lanza SQLException … lanza una nueva SQLException;  

Cuando este método es invocado desde otro método (metodo_2 ()), ese método puede atrapar al SQLException y envuélvalo dentro de una excepción sin marcar, para que no tenga que declarar la excepción en su firma de método.

private void method_2 () try method_1 ();  catch (java.sql.SQLException ex) lanza una nueva RuntimeException (ex);  

Rastro de pila de excepción

Un seguimiento de pila de excepción se refiere a la matriz de marcos de pila activos, cada uno de los cuales representa una invocación de método, capturada por la JVM en el momento en que se lanzó la excepción. Cada marco de pila incluye la ubicación de la invocación del método, incluido el nombre de la clase, el nombre del método y, posiblemente, el nombre del archivo de origen Java y el número de línea dentro del archivo. Es útil para rastrear la secuencia de llamadas que causó el error. Excepciones de Java: ¿Está manejándolas correctamente? Excepciones de Java: ¿Estás manejándolas bien? Una excepción en la programación significa una condición excepcional en la ejecución del programa. Se usa cuando la condición se puede manejar mejor en otros lugares. Considere los siguientes ejemplos de manejo de excepciones de Java. Lee mas .

Aquí hay un seguimiento de pila típico, obtenido del objeto de excepción cuando fue capturado.

Excepción en el hilo "main" java.lang.IndexOutOfBoundsException: Índice: 8, Tamaño: 5 en java.util.ArrayList.rangeCheck (ArrayList.java:653) en java.util.ArrayList.get (ArrayList.java:429) en sample.sample1.main (sample1.java:24) 

La excepción capturada aquí es IndexOutOfBoundsException. Incluye información adicional sobre el error. La traza de pila contiene 3 marcos de pila, cada uno de los cuales incluye la información de ubicación como se muestra.

Manejo de excepciones

Una excepción puede ser manejada atrapándola en un trata de atraparlo Bloquear y tomar cualquier acción correctiva que se requiera. los Excepción objeto proporciona varios métodos para extraer información sobre la condición que lo causó.

El siguiente código registra el mensaje de error en un archivo de registro.

private void loadConfig () try // invocar código que podría generar una captura IOException (java.io.IOException ex) // maneja la excepción aquí. Se puede registrar en un archivo de registro. log.warning (ex.getMessage ());  

Cuando se envuelve una excepción dentro de otra, puede recuperar la excepción envuelta:

Causa desechable = ex.getCause (); log.warning ("Causa subyacente:" + cause.getMessage ()); 

¿Necesita acceder al seguimiento de pila y tal vez extraer el nombre del método que lo causó??

StringBuilder sbuf = new StringBuilder ("Stack Trace:"); para (StackTraceElement el: ex.getStackTrace ()) sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n");  log.warning (sbuf.toString ()); 

O tal vez, registre la excepción y vuelva a lanzarla?

intente … catch (java.io.IOException ex) log.warning (ex.getMessage ()); tirar ex  

los Excepción clase proporciona un printStackTrace () Método que puede imprimir el seguimiento de la pila a su propio PrintStream (o PrintWriter).

intente … catch (java.io.IOException ex) PrintStream out =…; out.println (ex.getMessage ()); ex.printStackTrace (fuera);  

Puede capturar múltiples tipos de excepciones en una sola tratar Bloquear, y realizar un manejo específico para cada tipo de excepción..

intente // produce algunas excepciones aquí captura (java.io.IOException ex) // manejo específico de IOException aquí captura (java.sql.SQLException ex) // SQLException manejo específico aquí 

Para capturar múltiples tipos de excepciones pero usar el mismo código de manejo, puede declarar un captura Bloque con múltiples tipos de la siguiente manera:

intente // produce algunas excepciones aquí catch (java.io.IOException | java.sql.SQLException ex) // manejo específico de SIPLEception aquí catch (SAXException ex) // manejo específico de la excepción SXLE aquí 

Limpiando los recursos con Finalmente

Cuando se trata de un código que puede generar excepciones, es esencial realizar una limpieza adecuada de cualquier recurso, como los archivos abiertos. Todo lo que necesita saber sobre los formatos de archivo y sus propiedades Todo lo que necesita saber sobre los formatos de archivo y sus propiedades Usamos la palabra archivos intercambiables: música, imagen, hoja de cálculo, presentación de diapositivas, etc. ¿Pero qué hace que un archivo sea un "archivo"? Intentemos y entendamos esta parte fundamental de la computación. Lea más, conexiones de base de datos, etc. La limpieza de recursos debe realizarse en un finalmente bloquear. De esta manera, tanto la salida normal como la salida excepcional de un bloque invocan el código de limpieza Los 10 peores errores de programación de la historia Los 10 peores errores de programación de la historia En su pasado histórico, también se codifica la destrucción forjada. Las instancias de un poco de código malo causaron un desastre en un nivel importante. Los siguientes son 10 de los peores errores de programación en la historia. Lee mas .

InputStream in = null; intente … in = new FileInputStream (nombre de archivo);… catch (java.io.IOException ex) log.warning (ex.getMessage ());  finalmente // el código aquí se ejecuta al salir del bloque try, // ya sea normalmente o debido a una excepción if (en! = null) in.close ();  

Bloque de prueba con recursos

Java 1.7 introdujo el probar con recursos construcción que hace que la limpieza de recursos sea más fácil. Se parece a esto:

try (InputStream in = new FileInputStream (…)) // código que utiliza InputStream.  

Cuando el código sale del bloque (ya sea de forma limpia o debido a una excepción), el Flujo de entrada variable se limpia automáticamente.

Limpie múltiples recursos declarando todos ellos en la cabecera del bloque.

try (InputStream in = new FileInputStream (…); Connection con =…;) // código que utiliza InputStream y Connection.  

Cualquier objeto cuya clase implemente el AutoClosable La interfaz se puede limpiar de esta manera. La siguiente clase realiza una limpieza específica en el cerrar() método.

La clase pública MyClass implementa AutoCloseable public void close () // código de limpieza aquí 

Usa una instancia de esta clase en un probar con recursos bloquear.

try (MyClass obj = new MyClass (…)) // código que usa el objeto MyClass.  

Algunas excepciones comunes

Ahora echemos un vistazo a algunas excepciones comunes.

  • IndexOutOfBoundsException (sin marcar): indica que el índice del elemento al que se accede está fuera de los límites de una matriz, cadena, etc..
  • SQLException (marcado): lanzado debido a un error en la base de datos.
  • IOException (marcado): error de acceso al archivo o errores relacionados con la entrada y la salida.
  • Excepción interrumpida (marcado): se lanza cuando se interrumpe la ejecución de un hilo.
  • SAXException (marcado): lanzado debido a errores de análisis de XML.
  • Excepción de puntero nulo (sin marcar): usando nulo donde se requiere un objeto.

Terminando

Las excepciones son el método principal para el informe y la gestión de errores en Java. El uso adecuado de las excepciones mejora la calidad del código. Escritura o código más rápido en su editor de texto de Linux con temas personalizados. Escritura o código más rápido en su editor de texto de Linux. ¿Por qué no modificarlo para mejorar su productividad, ya sea mediante secuencias de comandos y codificación o mediante el uso de la herramienta como editor de marcado? Lea más y ayude a resolver problemas en producción..

¿Tienes alguna historia de guerra relacionada con la excepción para relatar? Si es así, cuéntanoslo en la sección de comentarios a continuación..

Crédito de la imagen: Dmitry Nikolaev a través de Shutterstock.com

Explorar más sobre: ​​Java, Programación.