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