Вы находитесь на странице: 1из 7

Introduccin

ICI341 - Principios de Lenguajes


de Programacin

 Una excepcin es un evento que ocurre durante la


ejecucin de un programa, y que interrumpe su flujo de
control normal. Normalmente se encuentran asociadas a
errores.
 Los errores pueden tener distintos orgenes: falla del disco
duro, problemas en la red, problemas de programacin (ej.
divisin por cero), etc.

Java: control de excepciones


Claudio Cubillos
Escuela de Ingeniera Informtica
Pontificia Universidad Catlica de Valparaso, Chile
claudio.cubillos@ucv.cl
*Material realizado por el Prof. Franco Guidi

Deteccin de errores

Ejemplo 1
 Un caso de divisin por cero:

 Cuando ocurre un error durante la ejecucin de un mtodo en Java se


genera un objeto excepcin que es enviado al ambiente de ejecucin. El
flujo de control normal del programa es interrumpido.

public class Par {


int x, y;
public Par(int x, int y ){
this.x = x;
this.y = y;
}
public int divide() {
return x/y;
}
}

 El objeto excepcin contiene informacin relativa al error, incluyendo el


tipo del mismo y el estado del programa al momento de haberse
producido.

Excepcin
Stack mtodos

 Cuando se genera el objeto excepcin,


el ambiente de ejecucin busca
en el stack de llamadas a mtodos
alguno que sea capaz de manejar
la excepcin (exception handler).
Si no lo encuentra, la JVM se hace cargo
de l, y el programa termina con
un mensaje de error.

mtodo n

mtodo 2
mtodo 1
JVM

public class Division{


public static void main(String[] arg) {
Par par = new Par( 100, 0 );
par.divide();
System.out.println(Fin programa);
}
}

Clase Par, recibe dos


nmeros enteros
y permite obtener el
cuociente entre ellos

El objeto de la clase Par


realizar una divisin
por cero

Ejemplo 1: Stack de llamadas a mtodos

Ejecucin del ejemplo 1

 El mtodo main invoca al mtodo divide del objeto de la clase Par.


 Durante la ejecucin del mtodo divide se genera una excepcin.

...
return x/y;
...
...
par.divide();
...

divide
main

 Clase de excepcin:

(y = 0)

 java.lang.ArithmeticException

 Informacin:
 / by zero (divisin por cero)

 Stack de llamadas de mtodos:


 1. Mtodo divide de la clase Par (archivo Par.java, lnea 11)

Java Virtual Machine

llamado por

 2. Mtodo main de la clase Division (archivo Division.java, lnea 6)

La jerarqua de excepciones

Opciones en el control de excepciones


 Frente a un determinado tipo de excepcin un mtodo
puede:

Object

 Lanzar la excepcin fuera de l, para traspasar al mtodo


invocante la responsabilidad de tratar la excepcin; o en caso de
ser el primer mtodo del stack de llamadas, traspasar la
responsabilidad a la JVM.
 Capturar la excepcin, y proveer un flujo de control alternativo.

Throwable

Error

Exception
Excepcin

RuntimeException

Stack
mtodos

divide
main
JVM

Control de excepciones: lanzamiento de una excepcin


(cont.)

Control de excepciones: lanzamiento de una excepcin


 Para indicar que un mtodo traspasar la responsabilidad
del control de excepciones al mtodo llamante, se debe
usar la clusula throws en la declaracin del mtodo,
seguida por el nombre de la excepcin:

 Un ejemplo clsico: lectura de datos de la consola


import java.io.* ;
public class Factorial {
public static void main( String arg[ ] ) throws IOException {
int nmero=0, i=1, fact=1;
BufferedReader lector = new BufferedReader( new InputStreamReader( System.in ) );
String ingresado=null;
System.out.println( "Ingrese nmero para clculo de factorial: " );
ingresado = lector.readLine( );
nmero = Integer.parseInt( ingresado );
while( i <= nmero ) {
fact = fact * i;
i++;
}
System.out.println( "El factorial de " + nmero + " es " + fact );
} // Fin mtodo main
} // Fin clase

 Ejemplo:
Nombre
excepcin

public boolean startPlaying() throws SoundException {


...
}

Control de excepciones: captura de una excepcin

10

Control de excepciones: captura de una excepcin (cont.)

 Las excepciones pueden ser capturadas y manejadas


usando bloques try, catch y finally (operan en
conjunto)

 Formato general:
El tipo de excepcin
(Tipo_Excepcin1,
Tipo_Excepcin2, etc.)
representa la clase de
excepcin que se puede
generar en el bloque try
que interesa capturar y
controlar.

 El bloque try debe incluir las instrucciones que pueden generar la


excepcin que se desea manejar. Debe ser seguido por al menos
un bloque catch o un bloque finally.
 El bloque catch debe seguir al bloque try, y debe contener las
instrucciones que sern ejecutadas en caso de generarse una
excepcin.

Al producirse una
excepcin slo uno de
los bloques catch ser
ejecutado

 El bloque finally incluye las instrucciones que debern


ejecutarse independientemente de la generacin (o ausencia) de
una excepcin (normalmente usados para liberar recursos).

El orden de los catch es


importante: las subclases
de excepciones deben ser
especificadas antes de
sus superclases
11

try {
}

}
}

// instrucciones que pueden fallar

catch (Tipo_excepci
Tipo_excepcin1 nombre_variable){
nombre_variable){
// instrucciones a ejecutar si se produce
// una excepcin tipo 1

catch (Tipo_excepci
Tipo_excepcin2 nombre_variable){
nombre_variable){
// instrucciones a ejecutar si se produce
// una excepcin tipo 2

catch (Tipo_excepci
Tipo_excepcinN nombre_variable){
nombre_variable){
// instrucciones a ejecutar si se produce
// una excepcin tipo N

finally{
finally{
// instrucciones a ejecutar siempre

12

Control de excepciones: captura de una excepcin (cont.)


 (Nuevamente) el ejemplo clsico:

Ejemplo 2: captura de una excepcin


public class Par {
int x, y;
public Par(int x, int y ){
this.x = x;
this.y = y;
}
public int divide() {
try{
return x/y;
}catch(ArithmeticException e){
return 999999999;
}
}
}

import java.io.* ;
public class Factorial {
public static void main( String arg[ ] ){
int nmero=0, i=1, fact=1;
BufferedReader lector = new BufferedReader( new InputStreamReader( System.in ) );
String ingresado=null;
System.out.println( "Ingrese nmero para clculo de factorial: " );
try {
ingresado = lector.readLine( );
nmero = Integer.parseInt( ingresado );
while( i <= nmero ) {
fact = fact * i;
i++;
System.out.println( "El factorial de " + nmero + " es " + fact );
}
} catch( IOException e ) {
System.out.println( "Error de input." );
}
} // Fin mtodo main
} // Fin clase

 En este caso la
excepcin es
interceptada en el
mtodo divide

Nota: en el ejemplo es
discutible la decisin de
retornar esta constante en
caso de error en la divisin

public class Division{


public static void main(String[] arg) {
Par par = new Par( 100, 0 );
int res = par.divide();
System.out.println( "El cuociente es: " + res );
}
}

13

Ejecucin del ejemplo 2

14

Informacin relacionada con la excepcin


 Toda instancia de excepcin tiene un mtodo
printStackTrace, que imprime el stack de llamadas de
mtodos al momento de generarse.

 A pesar del error el programa completa su ejecucin


normalmente:

 Este mtodo puede ser utilizado para proporcionar


informacin relacionada con la excepcin dentro del bloque
catch correspondiente:
try {

 Qu ocurre?

// instrucciones que pueden fallar

} catch (Tipo_excepci
Tipo_excepcin nombre_variable){
nombre_variable){
nombre_variable.printStackTrace
nombre_variable.printStackTrace()
.printStackTrace();
();
}

 La excepcin se produce en el mtodo divide() de la clase Par,


dentro del bloque try. Esta excepcin es capturada en el bloque
catch, y el cdigo escrito en este ltimo es ejecutado.

15

16

Ejemplo 3: impresin de la informacin asociada a la


excepcin
1 public class Par {
2
int x, y;
3
public Par(int x, int y ){
4
this.x = x;
5
this.y = y;
6
}
7
public int divide() {
8
try{
9
return x/y;
10
}catch(ArithmeticException e){
11
e.printStackTrace();
12
return 999999999;
13
}
14
}
15 }

Ejecucin del ejemplo 3


 El programa ahora indica el tipo de excepcin y lugar
donde sta se produjo:

 El objeto excepcin es
referenciado al interior
del bloque catch por
medio de la variable e
 Se invoca el mtodo
printStackTrace
sobre el objeto excepcin

 Notar que el programa termina su ejecucin normalmente.

1 public class Division{


2
public static void main(String[] arg) {
3
Par par = new Par( 100, 0 );
4
int res = par.divide();
5
System.out.println( "El cuociente es: " + res );
6 }
7 }

17

La clase RuntimeException

18

La clase RuntimeException (cont.)


 Ejemplo: ArithmeticException es subclase de
RuntimeException. Por tanto las siguientes
implementaciones de la clase Par son equivalentes:

 Representa excepciones comunes que se presentan en la


JVM durante la ejecucin de programas. Ejemplo:
NullPointerException.
 Debido a la ubicuidad de este tipo de excepciones, el
compilador permite no especificar el mecanismo de control
de las RuntimeExceptions: cuando este mecanismo no
es especificado, estas excepciones sern lanzadas fuera del
mtodo actual.
RuntimeException

public class Par {


int x, y;
public Par(int x, int y ){
this.x = x;
this.y = y;
}
public int divide()
throws ArithmeticException {
return x/y;
}
}

public class Par {


int x, y;
public Par(int x, int y ){
this.x = x;
this.y = y;
}
public int divide() {
return x/y;
}
}

NullPointerException

19

20

Crear nuevas excepciones

Crear nuevas excepciones (cont.)


 Ejemplo:

 Se pueden crear nuevas excepciones extendiendo la clase


Exception o una de sus subclases.
 La clase Exception ofrece distintos constructores que
pueden ser referenciados desde las subclases. Los ms
utilizados son:

public class UnsupportedMediaException extends Exception{


public UnsupportedMediaException(){
super( The selected media is not supported. );
}
}

 public Exception(): inicializa la excepcin con valores de


default (mensaje nulo)
 public Exception(String mensaje): inicializa la excepcin
con el mensaje recibido como parmetro.

 Convencin: el nombre de las excepciones termina en la


palabra Exception

 Nota: la clase RuntimeException tambin puede ser


extendida.

21

Lanzamiento de una excepcin

22

Ejemplo 4: creacin y lanzamiento de excepciones


public class Test{
public static void main(String[] arg) throws UnsupportedMediaException {
Recorder r = new Recorder( "CD" );
r.saveOn( "DVD" );
System.out.println( "Saved." );
}
}

 Una excepcin puede ser lanzada en cualquier parte del


cdigo usando la instruccin throw acompaada de la
referencia a un objeto excepcin:
throw new NombreExcepcin( parmetros_constructor )
 Ejemplo:
public void saveData throws UnsupportedMediaException{
...
if( !isCompatible( requestedMedia ) )
throw new UnsupportedMediaException();
...
}

23

public class Recorder {


String media;
public Recorder( String mediaType ){
media = mediaType;
}
public void saveOn( String mediaType ) throws UnsupportedMediaException{
if( media.equals( mediaType ) )
System.out.println( "Saving." );
else
throw new UnsupportedMediaException();
}
}
public class UnsupportedMediaException extends Exception {
public UnsupportedMediaException() {
super( "The selected media is not supported" );
}
}
24

Ejecucin del ejemplo 4

Ejercicio

La excepcin definida se comporta como cualquier


otra excepcin:

 Se pide crear la clase Temperature, para registrar


temperaturas en grados Celsius (C) y Kelvin (K).
Una instancia de la clase deber almacenar un valor de
temperatura y lo retornar en cualquiera de las escalas.
Para ello la clase deber ofrecer los mtodos setC y setK
para establecer valores en C y K, y los mtodos getC y
getK para retornar los valores en C y K,
respectivamente.
Notar que no es fsicamente posible admitir temperaturas
inferiores a los 0K, por lo tanto ser necesario generar una
excepcin (IllegalTemperatureException) cuando un
valor fuera de rango trate de ser ingresado.
Genere las clases indicadas, y una aplicacin que permita
ingresar valores y visualizarlos.

25

Discusin
 Considere los siguientes ejemplos:
 Una clase CuentaCorriente (que maneja una
cuenta bancaria) no debe admitir giros mayores que
el saldo disponible. En caso de ser inadmisible el
giro, ste podra ser impedido:
Retornado false en el mtodo que efecta el giro.
Generando una excepcin en el mtodo que efecta el
giro.

 En la clase Temperature del ejemplo anterior se


genera una excepcin cuando se trata de establecer
una temperatura invlida. Alternativamente se podra
haber obviado la creacin de la excepcin, y haber
retornado falso en los mtodos setK y setC.

 Cundo conviene generar excepciones?

27

26

Вам также может понравиться