Excepciones en Java


Si un programa Java viola una restricción semántica de lenguaje se producirá un error, comunicándolo la máquina virtual Java al programa mediante una excepción. Esta aplicación Java en ejecución no debe morir y generar un core (o crash en DOS), debe lanzar una excepción (throw) y capturar (catch) para resolver la situación de error generada.

Hay muchos tipos de errores que pueden provocar una excepción, por ejemplo, un desbordamiento de memoria o un disco duro estropeado. Cuando ocurre algun tipo de error, la máquina virtual Java crea un objeto de la clase exception o error y se notifica el hecho al sistema de ejecución.

Los programas escritos en Java también pueden lanzar excepciones explícitamente mediante la instrucción throw, lo que facilita la devolución de un “código de error” al método que invocó el método que causó el error. Veamos un ejemplo.

public class Excepciones1 { public static void main(String[] arg) { metodo(); } static void metodo() { int divisor = 0; int resultado = 100/divisor; System.out.println(“Resultado: ” + resultado); System.out.println(“Una Suma:” + (3+4)); } }

Si ejecutamos ese programa, se generara una excepción automáticamente y se nos indicara por pantalla.

Generación de excepciones en Java


Es preferible tener declaradas todas las posibles excepciones que se puedan generar en dicho método, para lo que se utilizara la sentencia throws de la declaración de métodos.

Para poder lanzar una excepción es necesario crear un objeto de tipo Exception o alguna de sus subclases como ArithmeticException y lanzarlo mediante la instrucción throw cmo se muestra en este ejemplo:

class LanzaExcepcion { public static void main(String argumentos[]) throws ArithmeticException { int i=1, j=2; if (i/j< 1) throw new ArithmeticException(); else System.out.println(i/j); } }

Captura de Excepciones


Se trata de un controlador de excepciones que se encargara de tratar las posibles excepciones que se puedan generar. Utilizando unos mecanismos, los manejadores de excepciones, que se estructuran en tres bloques; try, catch y finally.

Bloque try


Lo primero que hay que hacer para que un método sea capaz de tratar una excepción generada por la máquina virtual Java es encerrar las instrucciones susceptibles de generarla en un bloque try.

try { Bloque de Instrucciones }

Cualquier excepción que se produzca dentro del bloque try será analizado por el bloque o bloques catch que se verá en el punto siguiente. En el momento en que se produzca la excepción, se abandona el bloque try y, por lo tanto, las instrucciones que sigan al punto donde se produjo la excepción no serán ejecutadas. Cada bloque try debe tener asociado al menos un bloque catch.

Bloque catch


Por cada bloque try pueden declararse uno o varios bloques catch, cada uno de ellos capaz de tratar un tipo u otro de excepción.

try { Bloque de Instrucciones } catch (TipoExcepción nombreVariable) { Bloque de Instrucciones del primer catch } catch (TipoExcepción nombreVariable) { Bloque de Instrucciones del segundo catch } ...

Bloque finally


El bloque finally se utiliza para ejecutar un bloque de instrucciones sea cual sea la excepción que se produzca. Este bloque se ejecutará en cualquier caso, incluso si no se produce ninguna excepción. Sirve para no tener que repetir código en el bloque try y en los bloques catch.

try { Bloque de Instrucciones del try } catch (TipoExcepción nombreVariable) { Bloque de Instrucciones del catch } ..... }finally { Bloque de Instrucciones de finally }

Creación de Excepciones


Se pueden definir excepciones propias en Java, no hay por qué limitarse a las predefinidas, bastará con que la clase extienda de la clase Exception y proporcionar la funcionalidad extra que requiera el tratamiento de esa excepción.

Por ejemplo, consideremos un programa cliente/servidor. El código cliente se intenta conectar al servidor, y durante 5 segundos se espera a que conteste el servidor. Si el servidor no responde, el servidor lanzaría la excepción de time-out:

class ServerTimeOutException extends Exception {} public void conectame( String nombreServidor ) throws Exception { int exito; int puerto = 80; exito = open( nombreServidor,puerto ); if( exito == -1 ) throw ServerTimeOutException; }