miércoles, 30 de mayo de 2012

5.4 Gestión de excepciones

Lanzamiento de excepciones: throw - throws

Muchas veces el programador dentro de un determinado método deberá comprobar si alguna condición de excepción se cumple, y si es así lanzarla. Para ello se utilizan las palabras reservadas throw y throws.



Por una parte la excepción se lanza mediante la sentencia throw:

if ( condicion_de_excepcion == true )

throw new miExcepcion();



Se puede observar que hemos creado un objeto de la clase miExcepcion, puesto que las excepciones son objetos y por tanto deberán ser instanciadas antes de ser lanzadas.

Aquellos métodos que pueden lanzar excepciones, deben cuáles son esas excepciones en su declaración. Para ello se utiliza la sentencia throws:



tipo_devuelto miMetodoLanzador() throws miExcep1, miExcep2 {

// Codigo capaz de lanzar excepciones miExcep1 y miExcep2

}



Se puede observar que cuando se pueden lanzar en el método más de una excepción se deben indicar en sus declaraciones separadas por comas.



Ejemplo de gestión de excepciones.

Ahora que ya sabemos cómo funciona este sistema, conviene ver al menos un pequeño ejemplo, que ilustre al lector en el uso de las excepciones:



// Creo una excepción personalizada

class MiExcepcion extends Exception {

MiExcepcion(){

super(); // constructor por defecto de Exception

}



MiExcepcion( String cadena ){

super( cadena ); // constructor param. de Exception

}

}



// Esta clase lanzará la excepción

class Lanzadora {

void lanzaSiNegativo( int param ) throws MiExcepcion {

if ( param < 0 )

throw new MiExcepcion( "Numero negativo" );

}

}



class Excepciones {

public static void main( String[] args ) {

// Para leer un fichero

Lanzadora lanza = new Lanzadora();



FileInputStream entrada = null;

int leo;



try {

entrada = new FileInputStream( "fich.txt" );

while ( ( leo = entrada.read() ) != -1 )

lanza.lanzaSiNegativo( leo );

entrada.close();

System.out.println( "Todo fue bien" );

} catch ( MiExcepcion e ){ // Personalizada



System.out.println( "Excepcion: " + e.getMessage() );

}



catch ( IOException e ){ // Estándar

System.out.println( "Excepcion: " + e.getMessage() );

}



finally {

if ( entrada != null )

try {



entrada.close(); // Siempre queda cerrado

} catch ( Exception e ) {



System.out.println( "Excepcion: " + e.getMessage() );

}



System.out.println( "Fichero cerrado." );

}

}

}



class Excepciones {

public static void main( String[] args ) {

// Para leer un fichero



FileInputStream entrada = null;

Lanzadora lanza = new Lanzadora();

int leo;



try {

entrada = new FileInputStream("fich.txt");

while ( ( leo = entrada.read() ) != -1 )

lanza.lanzaSiNegativo( leo );

System.out.println( "Todo fue bien" );

} catch ( MiExcepcion e ){ // Personalizada



System.out.println( "Excepcion: " + e.getMessage() );

} catch ( IOException e ){ // Estándar



System.out.println( "Excepcion: " + e.getMessage() );

} finally {



entrada.close(); // Así el fichero siempre queda cerrado

System.out.println( "Fichero cerrado" );

}

}

}



Este programa lee un fichero (fichero.txt), y lee su contenido en forma de números. Si alguno de los números leídos es negativo, lanza una excepción MiExcepcion, Además gestiona la excepción IOException, que es una excepción de las que Java incluye y que se lanza si hay algún problema en una operación de entrada/salida. Ambas excepciones son gestionadas, imprimiendo su contenido (cadena de error) por pantalla.



La salida de este programa, suponiendo un número negativo sería:



Excepcion: Numero negativo - Fichero cerrado



En el caso de que no hubiera ningún número negativo sería:

Todo fue bien - Fichero cerrado



En el caso de que se produjese un error de E/S, al leer el primer número, sería:

Excepcion: java.io.IOException - Fichero cerrado

No hay comentarios:

Publicar un comentario