Excepciones de Java ¿Las está manejando bien?

  • Owen Little
  • 0
  • 2814
  • 227
Anuncio

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

  • Si no se abre un archivo de configuración, se puede manejar mejor más arriba en el código, tal vez mediante el uso de una ubicación alternativa del archivo de configuración.
  • Acceso a un elemento de matriz Cómo usar una Java ArrayList Cómo usar una Java ArrayList Una matriz de Java es una matriz redimensionable de propósito general. Proporciona la mayoría de las instalaciones que generalmente se esperan de las matrices en otros idiomas. En este artículo aprenderá a configurar y usar una lista de arrays. fuera de los límites de la matriz significa un error de programa. Feliz depuración!
  • Un error de análisis XML debe notificarse al usuario para que el archivo XML pueda corregirse.
  • El programa que se está quedando sin memoria (tal vez cuando se procesa un archivo grande) puede rectificarse tal vez aumentando la cantidad de memoria disponible para el proceso de Java.

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

Tipos de excepciones

La imagen a continuación muestra las partes principales de la Jerarquía de excepciones Java. La clase base es Tirable que se subclasifica 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 ejecución de Java que las aplicaciones no deberían detectar. Algunos ejemplos son: Error de memoria insuficiente y StackOverflowError.

Un Excepción nuevamente es de dos tipos: marcado y no marcado. Una excepción marcada debe ser manejada por el código de llamada. Esta regla es aplicada por el compilador de Java. Una excepción no verificada, por otro lado, puede propagarse por la cadena de llamadas sin tener que declararla explícitamente. Los siguientes ejemplos aclararán.

Excepciones marcadas

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

El siguiente código será no compilar ya que tampoco.

private void loadFile (String filename) FileReader in = new FileReader (filename);  

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));  catch (FileNotFoundException ex) // maneja la excepción aquí 

Si la persona que llama no puede manejar la excepción directamente, debe declararse en la firma del método.

loadFile privado vacío (String filename) arroja java.io.FileNotFoundException FileReader in = new FileReader (filename));  

Excepciones no verificadas

Una excepción no marcada es aquella que se subclasifica de Excepción en tiempo de ejecución y no necesita ser manejado directamente o declarado como se indicó anteriormente. Por ejemplo, el siguiente código da como resultado un Excepción de puntero nulo, que es un tipo de Excepción en tiempo de ejecución. El código, sin embargo, se compila sin error ya que Excepción de puntero nulo es una excepción no verificada.

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

Envolviendo Excepciones

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

El siguiente ejemplo de código muestra cómo envolver una excepción. El método Método 1() arroja un SQLException en su cuerpo Para que el código se compile correctamente, se debe declarar que se ha lanzado la excepción.

private void method_1 () arroja SQLException ... arroja nueva SQLException;  

Cuando se invoca este método desde otro método (método_2 ()), ese método puede atrapar el SQLException y envolverlo dentro de una excepción no marcada, para que no tenga que declarar la excepción en su firma de método.

privado void method_2 () try method_1 ();  catch (java.sql.SQLException ex) lanzar nueva RuntimeException (ex);  

Rastreo de pila de excepción

Un seguimiento de pila de excepción se refiere a la matriz de tramas de pila activas, cada una de las 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 fuente de Java y el número de línea dentro del archivo. Es útil para rastrear la secuencia de llamadas que causaron el error. Excepciones de Java: ¿las está manejando bien? Excepciones de Java: ¿las está manejando 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 otro lugar. Considere los siguientes ejemplos de manejo de excepciones de Java. .

Aquí hay una traza de pila típica, obtenida del objeto de excepción cuando fue capturado.

Excepción en el hilo "principal" 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 atrapada aquí es IndexOutOfBoundsException. Incluye información adicional sobre el error. El seguimiento de la pila contiene 3 cuadros de pila, cada uno de los cuales incluye la información de ubicación como se muestra.

Manejo de excepciones

Una excepción puede manejarse atrapándola en un trata de atraparlo bloquear y tomar cualquier acción correctiva que se requiera. los Excepción El 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 // invoque el código que podría generar una captura IOException (java.io.IOException ex) // maneje la excepción aquí. Puede registrarse en un archivo de registro. log.warning (ex.getMessage ());  

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

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

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

StringBuilder sbuf = new StringBuilder ("Stack Trace:"); for (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 la clase proporciona un printStackTrace () método que puede imprimir el seguimiento de la pila a su propio PrintStream (o PrintWriter).

pruebe … 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 // arroja algunas excepciones aquí catch (java.io.IOException ex) // Manejo específico de IOException aquí catch (java.sql.SQLException ex) // Manejo específico de SQLException aquí 

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

intente // arroja algunas excepciones aquí catch (java.io.IOException | java.sql.SQLException ex) // Manejo específico de IOException y SQLException aquí catch (SAXException ex) // Manejo específico de SAXException aquí 

Limpiando recursos con finalmente

Cuando se trata de código que puede generar excepciones, es esencial realizar una limpieza adecuada de los recursos, 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 Utilizamos la palabra archivo intercambiable: música, imagen, hoja de cálculo, presentación de diapositivas, etc. Pero, de todos modos, ¿qué hace que un archivo sea un "archivo"? Probemos y comprendamos esta parte fundamental de la informática. , conexiones de bases 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 en la historia Los 10 peores errores de programación en la historia En su pasado histórico, también codifica la destrucción forjada. Las instancias de un poco de código incorrecto causaron desastres en un nivel importante. Los siguientes son 10 de los peores errores de programación de la historia.. .

InputStream en = nulo; 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 (in! = null) in.close ();  

Bloque de prueba con recursos

Java 1.7 introdujo el probar con recursos construcción que facilita la limpieza de recursos. Se parece a esto:

try (InputStream in = new FileInputStream (...)) // código que usa 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.

Limpia múltiples recursos declarándolos todos en la cabeza del bloque.

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

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

public class MyClass implementa AutoCloseable public void close () // código de limpieza aquí 

Use 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 comúnmente encontradas

Veamos ahora 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): arrojado debido a un error de la base de datos.
  • IOException (marcado): error de acceso al archivo o errores que tienen que ver con la entrada y la salida.
  • Excepción interrumpida (marcado): arrojado cuando se interrumpe la ejecución de un hilo.
  • SAXException (marcado): arrojado debido a errores de análisis XML.
  • Excepción de puntero nulo (sin marcar): uso de nulo donde se requiere un objeto.

Terminando

Las excepciones son el método principal para informar y administrar errores en Java. El uso correcto de las excepciones mejora la calidad del código Escriba o codifique más rápido en su editor de texto de Linux con temas personalizados Escriba o escriba más rápido en su editor de texto de Linux con temas personalizados Su editor de texto de Linux no tiene que verse monótono y "funcional". ¿Por qué no ajustarlo para mejorar su productividad, ya sea scripting y codificación o usando la herramienta como editor de marcado? y ayuda para resolver problemas en producción.

¿Tienes alguna historia de guerra relacionada con excepciones 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




Nadie ha comentado sobre este artículo todavía.

Sobre tecnología moderna, simple y asequible.
Tu guía en el mundo de la tecnología moderna. Aprenda a usar las tecnologías y los dispositivos que nos rodean todos los días y aprenda a descubrir cosas interesantes en Internet.