Manejo de Excepciones

Anuncio
Programación Orientada a
Objetos
Manejo de Excepciones en JAVA
Angela C. Carrillo Ramos
Manejo de Excepciones
Excepción
Ocurre cuando una condición anormal
aparece en ejecución
ejecución.. Cuando se invocan
métodos sobre un objeto, el objeto puede:
puede:
Descubrir problemas internos de estado ( valores
incongruentes de las variables)
Detectar errores con los objetos o datos que manipula
(como la dirección de un archivo o red)
Determinar que se está transgrediendo su contrato
básico (como en la lectura de datos de un flujo ya
cerrado)..
cerrado)
Etc.
Etc.
1
Manejo de Excepciones
¿Cómo se manejan tradicionalmente
las excepciones?
Tratar de comprobar todos los errores
Saturar el código con muchas
verificaciones de errores
Manejo de Excepciones
¿Cómo se deben manejar las
excepciones?
Contar con un mecanismo para señalar
directamente los errores, en lugar de
indicadores o efectos colaterales tales
como campos que deben ser verificados.
verificados.
Capturarlas/Atraparlas cuando ocurren y
conocer su contexto
Desviar el control para poderlas manejar
2
Manejo de Excepciones
Capturarla/Atraparla
Poder indicar dónde puede ocurrir
Cuando se identifique, se debe poder
atrapar y controlar esta situación o
condición anormal
Desviar el control
Tener procedimientos de recuperación y
sobre todo conocer el contexto.
¿Qué paso y en qué contexto?
Excepciones en Java
Las excepciones son objetos
Throwable
Exception
Error
(Desbordamiento de una pila)
RuntimeException
(División por cero, índice inválido)
3
Manejo de Excepciones
/* Esto forma parte del cuerpo de un método */
try{
try{
<bloque de código donde pueden ocurrir las excepciones por Invocaciones de métodos, por ejemplo>
}catch(ClaseException1 e){
e){
<Manejo de excepción de ClaseException1>
}
catch(ClaseException2 e){
e){
<Manejo de excepción de ClaseException2>
}
Manejo de Excepciones
class Division{
public static void main(String args[]){
int a=0, b=0,c=0, i;
Random r = new Random();
for (i=0; i<32000; i++){
try{
b=r.nextInt();
c=r.nextInt();
a=12345 / (b/c);
}catch(ArithmeticException e){
System.out.println(“Ocurrió una división por cero”);
a=0;
}
System.out.println(“a: “ + a );
}
}
}
4
Manejo de Excepciones
class ArregloArgumentos{
public static void main(String args[]){
try{
int a= args.length;
int b, c[]= {1};
System.out.println(“ El número de
argumento es: “ + a);
b=42 / a;
c[58]= 100;
}
catch(ArithmeticException e){
System.out.println(“Ocurrió una división
por cero” + e);
}
catch(IndexOutOfBoundsException e){
System.out.println(“Indice fuera de límites”
+ e );
}
}
Manejo de excepciones
Subclases de Excepciones propias
Para manejo de situaciones anormales
específicas de las aplicaciones que el
núcleo de Java no maneja
maneja..
Se definen así:
así:
class nomclase extends Exception
Exception{{
<cuerpo de la clase>
}
5
Manejo de excepciones
Ejemplo 1
class MiExcepcion extends Exception{
Exception{
private String detalle;
public MiExcepcion(String a){
detalle = a;
}
public String toString(){
return “Mi excepción [ “ + detalle + “]”;
}
}
Manejo de excepciones
Ejemplo 2
class OtraExcepción extends Exception{
Exception{
public OtraExcepción(String detalle){
super( detalle );
}
}
6
Manejo de Excepciones
// Donde se desee escribir el detalle se
utiliza
OtraExcepción oe;
...
...(“Lo que sucedió fue” +
oe.getMessage());
Manejo de excepciones
throws y throw
throws: Parte del encabezado del método el
throws:
cual indica qué tipo de excepciones pueden
lanzarse..
lanzarse
throw
throw:: cuando el usuario desea lanzar una
excepción.. Las excepciones del sistema son
excepción
lanzadas automáticamente una vez ocurran.
ocurran.
7
Manejo de Excepciones
public Fraccionario(int num, int den) throws
MiExcepcion {
if (den == 0) {
throw new MiExcepcion (“Fraccionario
invalido, den en 0” );
}
else{ ...}
}
Manejo de Excepciones
class MiFraccionario{
public static void main(String args[]) {
try {
int n, d;
Random r = new Random();
n=r.nextInt();
d=r.nextInt();
Fraccionario f=new Fraccionario(n,d);
}
catch(NullPointerException e) { //Falta memoria
System.err.println(“No se pudo crear el fraccionario”
+ e.getMessage() );
}
catch(MiExcepcion e) { // El denominador es 0
System.err.println( e );
}
catch(Exception e) { //Cualquier otra excepcion
System.err.println( “Excepcion” + e.getMessage() );
}
}
8
Manejo de Excepciones
Propagación de excepciones
Lanzar la excepción a nivel de método
Relanzar si es necesario hasta que
llegue a la Interfaz
Sólo se conoce qué pasó en la interfaz
Manejo de Excepciones
class Producto{
...............
.................
public void vender_Producto(int cantidad) throws
ProductoExcepcion{{
ProductoExcepcion
if (existenciaActual > cantidad){
existenciaActual -=cantidad;
}
else{
throw new ProductoExcepcion(“Cantidad insuficiente”);
}
...............
...............
}
9
Manejo de Excepciones
class Tienda{
Vector productos;
.................
public void vender_Producto(int codigo, String nombre, int cantidad) throws
TiendaExcepcion{{
ProductoExcepcion, TiendaExcepcion
Producto p;
if ( existe_Producto(codigo, nombre) ){
try{
p=dar_Producto(codigo, nombre);
p. vender_Producto(cantidad) ;
}
catch (ProductoExcepcion pe){
throw pe;
// Se relanza la excepción
}
else{
throw new TiendaExcepcion(“Producto Inexistente”);
}
...............
}
Manejo de Excepciones
class Tienda{
Vector productos;
.................
public int Vender_Producto(int codigo, String nombre, int cantidad) throws
ProductoExcepcion, TiendaExcepcion
TiendaExcepcion{{
Producto p;
if ( existe_Producto(codigo, nombre) ){
p=dar_Producto(codigo, nombre);
p. vender_Producto(cantidad)
return 1; // Si se produce la excepción ProductoExcepcion, no se alcanza
esta instrucción
}
else{
throw new TiendaExcepcion(“Producto Inexistente”);
return 0; //Esto no tiene alcance!!!
}
...............
...............
}
10
Manejo de Excepciones
class InterfazConsola{
Tienda t;
...............
public static void main(String args[]){
.......
try{
.........
t. vender_Producto(codigo, nombre, cantidad);
.........
}
catch (ProductoExcepcion pe){
System.out.println(pe);
}
catch (TiendaExcepcion te){
System.out.println(te);
}
//Falta considerar las excepciones propias de la Interfaz
...........
//Memoria (NullPointerException), E/S (IOException), Formatos, etc.
}
.............
}
11
Descargar