Está en la página 1de 9

Uso de excepciones en Java

En Java, cuando se produce un error en un mtodo,


se lanza un objeto Throwable.

Cualquier mtodo que haya llamado al mtodo puede capturar la


excepcin y tomar las medidas que estime oportunas.

Tras capturar la excepcin, el control no vuelve al mtodo en el que se


produjo la excepcin, sino que la ejecucin del programa contina en el
punto donde se haya capturado la excepcin.

Consecuencia:
Nunca ms tendremos que preocuparnos de disear cdigos de error.

Jerarqua de clases para el manejo de excepciones en Java

# $

!"

Excepciones -6- Fernando Berzal


Throwable
Clase base que representa todo lo que se puede lanzar en Java

Contiene una instantnea del estado de la pila en el momento en el


que se cre el objeto ( stack trace o call chain").

Almacena un mensaje (variable de instancia de tipo String)


que podemos utilizar para detallar qu error se produjo.

Puede tener una causa, tambin de tipo Throwable,


que permite representar el error que caus este error.

Error
Subclase de Throwable que indica problemas graves que una aplicacin
no debera intentar solucionar (documentacin de Java).

Ejemplos: Memoria agotada, error interno de la JVM

Exception
Exception y sus subclases indican situaciones que una aplicacin
debera tratar de forma razonable.

Los dos tipos principales de excepciones son:

RuntimeException (errores del programador, como una divisin


por cero o el acceso fuera de los lmites de un array)

IOException (errores que no puede evitar el programador,


generalmente relacionados con la entrada/salida del programa).

Excepciones -7- Fernando Berzal


Captura de excepciones: Bloques trycatch
Se utilizan en Java para capturar las excepciones que se hayan podido
producir en el bloque de cdigo delimitado por try y catch.

En cuanto se produce la excepcin, la ejecucin del bloque try termina.

La clusula catch recibe como argumento un objeto Throwable.

// Bloque 1
try {
// Bloque 2
} catch (Exception error) {
// Bloque 3
}
// Bloque 4

Sin excepciones: 124


Con una excepcin en el bloque 2: 1 2* 3 4
Con una excepcin en el bloque 1: 1*

// Bloque 1
try {
// Bloque 2
} catch (ArithmeticException ae) {
// Bloque 3
} catch (NullPointerException ne) {
// Bloque 4
}
// Bloque 5

Sin excepciones: 125


Excepcin de tipo aritmtico: 1 2* 3 5
Acceso a un objeto nulo (null): 1 2* 4 5
Excepcin de otro tipo diferente: 1 2*
Excepciones -8- Fernando Berzal
// Bloque1
try {
// Bloque 2
} catch (ArithmeticException ae) {
// Bloque 3
} catch (Exception error) {
// Bloque 4
}
// Bloque 5

Sin excepciones: 125


Excepcin de tipo aritmtico: 1 2* 3 5
Excepcin de otro tipo diferente: 1 2* 4 5

Ojo! Las clusulas check se comprueban en orden

// Bloque1
try {
// Bloque 2
} catch (Exception error) {
// Bloque 3
} catch (ArithmeticException ae) {
// Bloque 4
}
// Bloque 5

Sin excepciones: 125


Excepcin de tipo aritmtico: 1 2* 3 5
Excepcin de otro tipo diferente: 1 2* 3 5

El bloque 4 nunca se llegar a ejecutar !

Excepciones -9- Fernando Berzal


La clusula finally

En ocasiones, nos interesa ejecutar un fragmento de cdigo


independientemente de si se produce o no una excepcin
(por ejemplo, cerrar un fichero que estemos manipulando).

// Bloque1
try {
// Bloque 2
} catch (ArithmeticException ae) {
// Bloque 3
} finally {
// Bloque 4
}
// Bloque 5

Sin excepciones: 1245


Excepcin de tipo aritmtico: 1 2* 3 4 5
Excepcin de otro tipo diferente: 1 2* 4

Si el cuerpo del bloque try llega a comenzar su ejecucin,


el bloque finally siempre se ejecutar

Detrs del bloque try si no se producen excepciones

Despus de un bloque catch si ste captura la excepcin.

Justo despus de que se produzca la excepcin si ninguna clusula


catch captura la excepcin y antes de que la excepcin se
propague hacia arriba.

Excepciones - 10 - Fernando Berzal


Lanzamiento de excepciones

La sentencia throw
Se utiliza en Java para lanzar objetos de tipo Throwable

throw new Exception(Mensaje de error);

Cuando se lanza una excepcin:


Se sale inmediatamente del bloque de cdigo actual
Si el bloque tiene asociada una clusula catch adecuada para el
tipo de la excepcin generada, se ejecuta el cuerpo de la clusula
catch.
Si no, se sale inmediatamente del bloque (o mtodo) dentro del cual
est el bloque en el que se produjo la excepcin y se busca una
clusula catch apropiada.
El proceso contina hasta llegar al mtodo main de la aplicacin. Si
ah tampoco existe una clusula catch adecuada, la mquina
virtual Java finaliza su ejecucin con un mensaje de error.

Propagacin de excepciones (throws)


Si en el cuerpo de un mtodo se lanza una excepcin (de un tipo derivado
de la clase Exception), en la cabecera del mtodo hay que aadir una
clusula throws que incluye una lista de los tipos de excepciones que se
pueden producir al invocar el mtodo.

Ejemplo

public String leerFichero (String nombreFichero)


throws IOException
...

Las excepciones de tipo RuntimeException (que son muy comunes)


no es necesario declararlas en la clusula throws.
Excepciones - 11 - Fernando Berzal
Al implementar un mtodo, hay que decidir si las excepciones se
propagarn hacia arriba (throws) o se capturar en el propio mtodo
(catch)

1. Un mtodo que propaga una excepcin:

public void f() throws IOException


{
// Fragmento de cdigo que puede
// lanzar una excepcin de tipo IOException
}

NOTA: Un mtodo puede lanzar una excepcin porque cree


explcitamente un objeto Throwable y lo lance con throw, o bien
porque llame a un mtodo que genere la excepcin y no la capture.

2. Un mtodo equivalente que no propaga la excepcin:

public void f()


{
// Fragmento de cdigo libre de excepciones

try {
// Fragmento de cdigo que puede
// lanzar una excepcin de tipo IOException
// (p.ej. Acceso a un fichero)
} catch (IOException error) {
// Tratamiento de la excepcin
} finally {
// Liberar recursos (siempre se hace)
}
}

Excepciones - 12 - Fernando Berzal


Ejemplo clsico

public void transferir


(String IDorigen, String IDdestino, int cantidad)
{
Cuenta origen;
Cuenta destino;

// Comenzar transaccin
database.startTransaction();

try {

origen = database.find(IDorigen);

if (origen == null)
throw new Exception("No existe + IDorigen);

origen.setBalance (origen.getBalance() cantidad);


database.store(origen);

destino = database.find(IDdestino);

if (destino == null)
throw new Exception("No existe + IDdestino);

destino.setBalance(destino.getBalance()+cantidad);
database.store(destino)

// Confirmar la transaccin
database.commit();

} catch (Exception error) {

// Cancelar la transaccin
database.rollback();
}
}

Excepciones - 13 - Fernando Berzal


Creacin de nuevos tipos de excepciones

Un nuevo tipo de excepcin puede crearse fcilmente: basta con definir


una subclase de un tipo de excepcin ya existente.

public DivideByZeroException
extends ArithmeticException
{
public DivideByZeroException(String Message)
{
super(message);
}
}

Una excepcin de este tipo puede entonces lanzarse


como cualquier otra excepcin:

public double dividir(int num, int den)


throws DivideByZeroException
{
if (den==0)
throw new DivideByZeroException(Error!);

return ((double) num/(double)den);`


}

NOTA: Las aplicaciones suelen definir sus propias


subclases de la clase Exception para representar
situaciones excepcionales especficas de cada aplicacin.

Excepciones - 14 - Fernando Berzal

También podría gustarte