0% encontró este documento útil (0 votos)
100 vistas8 páginas

Java Excepciones

El documento describe el control de excepciones en Java. Las excepciones son eventos que interrumpen el flujo normal de un programa, como errores de división por cero. Cuando ocurre una excepción, se genera un objeto excepción que contiene información sobre el error. El programa busca un método que pueda manejar la excepción; de lo contrario, la JVM maneja el error y el programa termina. Los métodos pueden lanzar excepciones a otros métodos o capturarlas para controlar el flujo alternativo.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
100 vistas8 páginas

Java Excepciones

El documento describe el control de excepciones en Java. Las excepciones son eventos que interrumpen el flujo normal de un programa, como errores de división por cero. Cuando ocurre una excepción, se genera un objeto excepción que contiene información sobre el error. El programa busca un método que pueda manejar la excepción; de lo contrario, la JVM maneja el error y el programa termina. Los métodos pueden lanzar excepciones a otros métodos o capturarlas para controlar el flujo alternativo.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Introducción

™ Una excepción es un evento que ocurre durante la


ejecución de un programa, y que interrumpe su flujo de
control normal. Normalmente se encuentran asociadas a
“errores”.
Java: control de excepciones ™ Los errores pueden tener distintos orígenes: falla del disco
duro, problemas en la red, problemas de programación (ej.
división por cero), etc.

Franco Guidi Polanco


Escuela de Ingeniería Industrial
Pontificia Universidad Católica de Valparaíso, Chile
[email protected]

Actualización: 07 de marzo de 2007


Franco Guidi Polanco 09-03-2007 2

Detección de errores Ejemplo 1

™ Cuando ocurre un error durante la ejecución de un método en Java se ™ Un caso de división por cero:
genera un objeto excepción que es enviado al ambiente de ejecución. El
flujo de control normal del programa es interrumpido.
public class Par {
™ El objeto excepción contiene información relativa al error, incluyendo el int x, y;
tipo del mismo y el estado del programa al momento de haberse public Par(int x, int y ){ Clase Par, recibe dos
producido. this.x = x; números enteros
this.y = y;
} y permite obtener el
™ Cuando se genera el objeto excepción, public int divide() { cuociente entre ellos
el ambiente de ejecución busca Excepción
return x/y;
en el stack de llamadas a métodos }
alguno que sea capaz de manejar }
Stack métodos

la excepción (exception handler). método n


Si no lo encuentra, la JVM se hace cargo … public class Division{
de él, y el programa termina con public static void main(String[] arg) { El objeto de la clase Par
un mensaje de error. método 2 Par par = new Par( 100, 0 );
método 1 par.divide(); realizará una división
System.out.println(“Fin programa”); por cero
JVM }
}

Franco Guidi Polanco 09-03-2007 3 Franco Guidi Polanco 09-03-2007 4


Ejemplo 1: Stack de llamadas a métodos Ejecución del ejemplo 1
™ El método main invoca al método divide del objeto de la clase Par.
™ Durante la ejecución del método divide se genera una excepción.

...
divide return x/y; (y = 0) ™ Clase de excepción:
... ƒ java.lang.ArithmeticException
...
™ Información:
main par.divide(); ƒ / by zero (división por cero)
...
™ Stack de llamadas de métodos:
ƒ 1. Método divide de la clase Par (archivo Par.java, línea 11)
Java Virtual Machine …llamado por…
ƒ 2. Método main de la clase Division (archivo Division.java, línea 6)

Franco Guidi Polanco 09-03-2007 5 Franco Guidi Polanco 09-03-2007 6

La jerarquía de excepciones Opciones en el control de excepciones

™ Frente a un determinado tipo de excepción un método


Object puede:
ƒ Lanzar la excepción fuera de él, para traspasar al método
invocante la responsabilidad de tratar la excepción; o en caso de
Throwable ser el primer método del stack de llamadas, traspasar la
responsabilidad a la JVM.
ƒ Capturar la excepción, y proveer un flujo de control alternativo.
Error Exception

Excepción

… … RuntimeException
divide

métodos
Stack
main

JVM
Franco Guidi Polanco 09-03-2007 7 Franco Guidi Polanco 09-03-2007 8
Control de excepciones: lanzamiento de una excepción
Control de excepciones: lanzamiento de una excepción
(cont.)
™ Para indicar que un método traspasará la responsabilidad ™ Un ejemplo clásico: lectura de datos de la consola
del control de excepciones al método llamante, se debe
usar la cláusula throws en la declaración del método, import java.io.* ;
seguida por el nombre de la excepción: public class Factorial {
public static void main( String arg[ ] ) throws IOException {
int número=0, i=1, fact=1;
BufferedReader lector = new BufferedReader( new InputStreamReader( System.in ) );
™ Ejemplo: String ingresado=null;
System.out.println( "Ingrese número para cálculo de factorial: " );
Nombre ingresado = lector.readLine( );
excepción número = Integer.parseInt( ingresado );
while( i <= número ) {
fact = fact * i;
i++;
public boolean startPlaying() throws SoundException {
}
... System.out.println( "El factorial de " + número + " es " + fact );
} } // Fin método main
} // Fin clase

Franco Guidi Polanco 09-03-2007 9 Franco Guidi Polanco 09-03-2007 10

Control de excepciones: captura de una excepción Control de excepciones: captura de una excepción (cont.)
try {
™ Las excepciones pueden ser capturadas y manejadas ™ Formato general: // instrucciones que pueden fallar
usando bloques try, catch y finally (operan en El tipo de excepción …
conjunto) (Tipo_Excepción1, } catch (Tipo_excepción1 nombre_variable){
Tipo_Excepción2, etc.) // instrucciones a ejecutar si se produce
representa la clase de // una excepción tipo 1
ƒ El bloque try debe incluir las instrucciones que pueden generar la excepción que se puede …
excepción que se desea manejar. Debe ser seguido por al menos generar en el bloque try } catch (Tipo_excepción2 nombre_variable){
un bloque catch o un bloque finally. que interesa capturar y // instrucciones a ejecutar si se produce
controlar.
// una excepción tipo 2
ƒ El bloque catch debe seguir al bloque try, y debe contener las Al producirse una …
instrucciones que serán ejecutadas en caso de generarse una excepción sólo uno de } catch (Tipo_excepciónN nombre_variable){
excepción. los bloques catch será // instrucciones a ejecutar si se produce
ejecutado // una excepción tipo N

ƒ El bloque finally incluye las instrucciones que deberán El orden de los catch es } finally{
ejecutarse independientemente de la generación (o ausencia) de importante: las subclases
una excepción (normalmente usados para liberar recursos). de excepciones deben ser
// instrucciones a ejecutar siempre
especificadas antes de
sus superclases }

Franco Guidi Polanco 09-03-2007 11 Franco Guidi Polanco 09-03-2007 12


Control de excepciones: captura de una excepción (cont.) Ejemplo 2: captura de una excepción

™ (Nuevamente) el ejemplo clásico: public class Par { ™ En este caso la


import java.io.* ;
int x, y; excepción es
public Par(int x, int y ){
public class Factorial { this.x = x; interceptada en el
public static void main( String arg[ ] ){ this.y = y; método divide
int número=0, i=1, fact=1; }
BufferedReader lector = new BufferedReader( new InputStreamReader( System.in ) ); public int divide() {
try{
String ingresado=null;
return x/y;
System.out.println( "Ingrese número para cálculo de factorial: " ); }catch(ArithmeticException e){
try { Nota: en el ejemplo es
return 999999999;
ingresado = lector.readLine( ); } discutible la decisión de
número = Integer.parseInt( ingresado ); } retornar esta constante en
while( i <= número ) { } caso de error en la división
fact = fact * i;
i++;
System.out.println( "El factorial de " + número + " es " + fact ); public class Division{
} public static void main(String[] arg) {
Par par = new Par( 100, 0 );
} catch( IOException e ) {
int res = par.divide();
System.out.println( "Error de input." ); System.out.println( "El cuociente es: " + res );
} }
} // Fin método main }
} // Fin clase
Franco Guidi Polanco 09-03-2007 13 Franco Guidi Polanco 09-03-2007 14

Ejecución del ejemplo 2 Información relacionada con la excepción

™ A pesar del error el programa completa su ejecución ™ Toda instancia de excepción tiene un método
normalmente: printStackTrace, que imprime el stack de llamadas de
métodos al momento de generarse.

™ Este método puede ser utilizado para proporcionar


información relacionada con la excepción dentro del bloque
catch correspondiente:

™ ¿Qué ocurre? try {


// instrucciones que pueden fallar
ƒ La excepción se produce en el método divide() de la clase Par, …
dentro del bloque try. Esta excepción es capturada en el bloque } catch (Tipo_excepción nombre_variable){
catch, y el código escrito en este último es ejecutado. nombre_variable.printStackTrace();
}

Franco Guidi Polanco 09-03-2007 15 Franco Guidi Polanco 09-03-2007 16


Ejemplo 3: impresión de la información asociada a la
excepción
Ejecución del ejemplo 3

1 public class Par { ™ El objeto excepción es ™ El programa ahora indica el tipo de excepción y lugar
referenciado al interior
2 int x, y;
3 public Par(int x, int y ){
del bloque catch por
donde ésta se produjo:
4 this.x = x;
5 this.y = y; medio de la variable e
6 }
7 public int divide() {
8 try{
9 return x/y; ™ Se invoca el método
10 }catch(ArithmeticException e){ printStackTrace
11 e.printStackTrace();
12 return 999999999; sobre el objeto excepción
13 }
14 }
15 }

1 public class Division{ ™ Notar que el programa termina su ejecución normalmente.


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 }

Franco Guidi Polanco 09-03-2007 17 Franco Guidi Polanco 09-03-2007 18

La clase RuntimeException La clase RuntimeException (cont.)

™ Representa excepciones comunes que se presentan en la ™ Ejemplo: ArithmeticException es subclase de


JVM durante la ejecución de programas. Ejemplo: RuntimeException. Por tanto las siguientes
NullPointerException. implementaciones de la clase Par son equivalentes:

™ Debido a la ubicuidad de este tipo de excepciones, el public class Par { public class Par {

compilador permite no especificar el mecanismo de control


int x, y; int x, y;
public Par(int x, int y ){ public Par(int x, int y ){
de las RuntimeExceptions: cuando este mecanismo no this.x = x;
this.y = y;
this.x = x;
this.y = y;
es especificado, estas excepciones serán lanzadas fuera del } }
public int divide() public int divide() {
método actual. throws ArithmeticException { return x/y;
return x/y; }
}
RuntimeException } }

NullPointerException

Franco Guidi Polanco 09-03-2007 19 Franco Guidi Polanco 09-03-2007 20


Crear nuevas excepciones Crear nuevas excepciones (cont.)

™ Se pueden crear nuevas excepciones extendiendo la clase ™ Ejemplo:


Exception o una de sus subclases.
public class UnsupportedMediaException extends Exception{
™ La clase Exception ofrece distintos constructores que public UnsupportedMediaException(){
pueden ser referenciados desde las subclases. Los más super( “The selected media is not supported.” );
utilizados son: }
}
ƒ public Exception(): inicializa la excepción con valores de
default (mensaje nulo)
ƒ public Exception(String mensaje): inicializa la excepción ™ Convención: el nombre de las excepciones termina en la
con el mensaje recibido como parámetro. palabra “Exception”
™ Nota: la clase RuntimeException también puede ser
extendida.

Franco Guidi Polanco 09-03-2007 21 Franco Guidi Polanco 09-03-2007 22

Lanzamiento de una excepción Ejemplo 4: creación y lanzamiento de excepciones


public class Test{
™ Una excepción puede ser lanzada en cualquier parte del public static void main(String[] arg) throws UnsupportedMediaException {
código usando la instrucción throw acompañada de la Recorder r = new Recorder( "CD" );
r.saveOn( "DVD" );
referencia a un objeto excepción: }
System.out.println( "Saved." );

}
throw new NombreExcepción( parámetros_constructor ) public class Recorder {
String media;

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

Franco Guidi Polanco 09-03-2007 23 Franco Guidi Polanco 09-03-2007 24


Ejecución del ejemplo 4 Ejercicio

™La excepción definida se comporta como cualquier ™ Se pide crear la clase Temperature, para registrar
temperaturas en grados Celsius (ºC) y Kelvin (ºK).
otra excepción:
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 métodos setC y setK
para establecer valores en ºC y ºK, y los métodos getC y
getK para retornar los valores en ºC y ºK,
respectivamente.

Notar que no es físicamente posible admitir temperaturas


inferiores a los 0ºK, por lo tanto será necesario generar una
excepción (IllegalTemperatureException) cuando un
valor fuera de rango trate de ser ingresado.
Genere las clases indicadas, y una aplicación que permita
ingresar valores y visualizarlos.

Franco Guidi Polanco 09-03-2007 25 Franco Guidi Polanco 09-03-2007 26

Discusión Excepciones: caso del Ariane 5

™ Considere los siguientes ejemplos: ™Vuelo 501, 4 de Junio de 1996, autodestrucción en


ƒ Una clase CuentaCorriente (que maneja una
cuenta bancaria) no debe admitir giros mayores que
H0 +39 :
el saldo disponible. En caso de ser inadmisible el
giro, éste podría ser impedido:
• Retornado false en el método que efectúa el giro.
• Generando una excepción en el método que efectúa el
giro.
ƒ En la clase Temperature del ejemplo anterior se
genera una excepción cuando se trata de establecer
una temperatura inválida. Alternativamente se podría
haber obviado la creación de la excepción, y haber
retornado falso en los métodos setK y setC.

™ ¿Cuándo conviene generar excepciones?

Costo: 500 millones de dólares


Franco Guidi Polanco 09-03-2007 27 Franco Guidi Polanco 09-03-2007 28
Excepciones: caso del Ariane 5 (cont.) Excepciones: caso del Ariane 5 (cont.)
™Sistema de control de vuelo: Reporte del equipo de investigación sobre la falla del vuelo 501:
Plataforma de ™ Aproximadamente en el instante H0 +39 segundos, el Ariane 5 comenzó
referencia inercial a desintegrarse debido a esfuerzos aerodinámicos excesivos ocasionados
por un ángulo de ataque inapropiado. Esto condujo a la separación de
Lecturas de giroscopios y acelerómetros los propulsores auxiliares respecto del cuerpo principal de la nave, por lo
que se gatilló el mecanismo de autodestrucción del cohete.
SRI: Inertial
SRI-1 SRI-2 Reference System ™ Este ángulo de ataque resultó ser consecuencia de una completa
desalineación entre las toberas de los propulsores auxiliares y aquella del
Bus de datos motor principal.
OBC: On-Board
Computer
™ La desalineación de las toberas fue comandada por el OBC a partir de
OBC-1 OBC-2 información transmitida por el SRI-2. Parte de estos datos no contenían
información de vuelo, sino un patrón de diagnóstico del SRI, el cual fue
interpretado como información de vuelo.
Servo-válvulas y
actuadores hidráulicos ™ La razón por la cual el SRI-2 no envió datos reales es que la unidad se
MOTORES había declarado en falla por una excepción de software.

Franco Guidi Polanco 09-03-2007 29 Franco Guidi Polanco 09-03-2007 30

Excepciones: caso del Ariane 5 (cont.) Excepciones: caso del Ariane 5 (cont.)
™ El OBC no pudo acceder al SRI-1 porque este se había desactivado ™ Comentarios:
algunos milisegundos antes por la misma razón que el SRI-2.
ƒ La operación inválida generaba correctamente una excepción. Sin
™ La excepción interna en el software del SRI fue ocasionada durante la embargo, el mecanismo de gestión de excepciones no fue diseñado
ejecución de una instrucción de conversión de un valor en formato para responder adecuadamente.
punto flotante de 64 bits a entero con signo de 16 bits, en
circunstancias que el valor excedía la capacidad del tipo entero. La
operación de conversión no estaba protegida, aún cuando asignaciones ƒ El mecanismo de tolerancia a fallas del Ariane 5 estaba concebido
de variables similares sí lo estaban. para tratar fallas aleatorias (por ej. malfuncionamiento del
hardware de uno de los computadores), no errores de diseño
™ El valor que se intentó convertir correspondía a la magnitud de la (ambas SRI experimentaron el mismo comportamiento al momento
variable HB (desviación horizontal), significativa sólo durante la fase de de producirse la falla).
alineación previa al despegue. Sin embargo, esta función de cálculo se
mantuvo operativa durante 40 segundos tras el despegue por un ƒ El equipo de investigación sobre el accidente sugirió cambiar el
requerimiento en el diseño del Ariane 4, no presente en el Ariane 5 (el enfoque de desarrollo utilizado hasta entonces, “el software se
diseño del SRI de ambas naves era en práctica idéntico). considera correcto hasta que se demuestra que falla”, por el
enfoque “se asume que el software es defectuoso hasta que, tras
™ La conversión del valor de la variable HB no estaba protegida porque el aplicar métodos aceptados como buenas prácticas, se logre
Ariane 4 realizaba una trayectoria inicial distinta a la del Ariane 5, en la demostrar que está correcto”.
cual dicha variable nunca tomaría valores fuera del rango esperado.
Franco Guidi Polanco 09-03-2007 31 Franco Guidi Polanco 09-03-2007 32

También podría gustarte