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:

  • La imposibilidad de abrir un archivo de configuración puede manejarse mejor en un nivel superior del código, tal vez mediante el uso de una ubicación alternativa del archivo de configuración.
  • Accediendo a un elemento de matriz Cómo usar una Java ArrayListUna 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. Lee mas 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 quizás aumentando la cantidad de memoria disponible para el proceso de Java.
    instagram viewer

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 Java Run-time Environment que las aplicaciones no deberían detectar. Algunos ejemplos son: Error de memoria insuficiente y StackOverflowError.

Jerarquía de excepciones

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 se 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 no lo hace.

private void loadFile (String filename) {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) {probar {FileReader in = new FileReader (nombre de archivo)); {} 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.

private void loadFile (String filename) arroja java.io. FileNotFoundException. {FileReader in = new FileReader (nombre de archivo)); { }

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 arriba. 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.

handleEvent privado vacío () {Nombre de cadena = nulo; 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, la excepción debe declararse como lanzada.

private void method_1 () arroja SQLException {... lanzar 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 eso causó el error 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. Lee mas .

Aquí hay una traza de pila típica, obtenida 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 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) {// maneja 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 quizás 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?

tratar {... } captura (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).

tratar {... } captura (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (fuera); }

Puede atrapar 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í. } captura (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í. } captura (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 cualquier recurso, como archivos abiertos Todo lo que necesita saber sobre los formatos de archivo y sus propiedadesUsamos el archivo de palabras indistintamente: 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. Lee mas , conexiones a 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 código de limpieza Los 10 peores errores de programación de la historiaEn su pasado histórico, codificando la destrucción forjada también. 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. Lee mas .

InputStream en = nulo; tratar {... in = new FileInputStream (nombre de archivo);... } captura (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 limpiamente 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 (..); Conexión 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í} }

Utilice 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 en 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): usando nulo donde se requiere un objeto.

Terminando

Las excepciones son el método principal para informar y administrar errores en Java. Uso apropiado de excepciones mejorar la calidad del código Escriba o codifique más rápido en su editor de texto de Linux con temas personalizadosSu 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? Lee mas y ayuda para resolver problemas en la 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