Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema 1. Introduccin al anlisis y diseo de programas Tema 2. Clases y objetos Tema 3. Herencia y Polimorfismo Tema 4. Tratamiento de errores Tema 5. Aspectos avanzados de los tipos de datos Tema 6. Modularidad y abstraccin: aspectos avanzados Tema 7. Entrada/salida con ficheros Tema 8. Verificacin y prueba de programas
Prcticas de Programacin
Prcticas de Programacin
Prcticas de Programacin
Ejemplo
El mtodo aadeAlumno de una supuesta clase Curso sera: /** aade un alumno. Retorna false si no se ha * podido aadir */ public boolean aadeAlumno(Alumno a) {...} Un fragmento de cdigo que aade dos alumnos sera: if (!aadeAlumno(a1)) { error.escribe("Error aadiendo alumno"); return; } ... if (!aadeAlumno(a2)) { error.escribe("Error aadiendo alumno"); return; } ... el tratamiento de los errores hace difcil entender el cdigo
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
4.2 Excepciones
Son un mecanismo especial para gestionar errores Permiten separar claramente el tratamiento de errores del cdigo normal Evitan que haya errores que pasen inadvertidos Permiten propagar de forma automtica los errores desde los mtodos ms internos a los ms externos Permiten agrupar en un lugar comn el tratamiento de errores que ocurren en varios lugares del programa Las excepciones se pueden elevar (o lanzar): automticamente, cuando el sistema detecta un error explcitamente cuando el programador lo establezca Presentes en lenguajes modernos (Java, Ada, C++,...)
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
Propagacin de excepciones
1. Una lnea de cdigo genera o lanza (throw) una excepcin 2. El bloque que contiene esa lnea de cdigo se aborta en ese punto 3. Si el bloque tiene un manejador para esa excepcin, el manejador se ejecuta diremos que el bloque ha cogido (catch) la excepcin la vida de la excepcin finaliza en este punto 4. Si no tiene manejador, la excepcin se propaga al bloque superior que, a su vez, podr cazar o dejar pasar la excepcin 5. Si la excepcin alcanza el bloque principal (main) y ste tampoco coge la excepcin, el programa finaliza con un mensaje de error
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
La salida generada ser: main: antes de intermedio intermedio: antes de divide divide: antes de dividir java.lang.ArithmeticException: / by zero at Propaga.divide(Propaga.java:13) at Propaga.intermedio(Propaga.java:20) at Propaga.main(Propaga.java:26)
Prcticas de Programacin
10
Prcticas de Programacin
11
Tema 4. Tratamiento de errores 4.3 Bloques de tratamiento excepciones Ejemplo: propagacin con bloque try-catch (cont.)
La salida por consola que obtenemos ahora es: main: antes de intermedio intermedio: antes de divide divide: antes de dividir intermedio: cazada ArithmeticException: / by zero main: despus de intermedio en este caso la excepcin es cazada, por lo que - el programa NO finaliza de forma abrupta - NO aparece un mensaje del sistema indicando que se ha producido una excepcin
Prcticas de Programacin
12
Tratamiento especfico
En el ejemplo anterior, el manejador realiza nicamente el tratamiento de la excepcin ArithmeticException try { ...; } catch (ArithmeticException e) { ...; } Es posible poner un tratamiento comn para cualquier excepcin try { ...; } catch (Exception e) { ...; } es cmodo pero no es recomendable, ya que puede ocurrir un tratamiento inadecuado para una excepcin no prevista
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
13
Exception
no es obligatorio tratarlas
Error
es obligatorio tratarlas
RuntimeException
ExceptionUsuario
RuntimeExceptionUsuario
Prcticas de Programacin
14
Error aritmtico (x/0, ...) ndice de array fuera de lmites (<0 o >=length) Intento de convertir a una clase incorrecta Argumento ilegal en la llamada a un mtodo Indice fuera de lmites (p.e., en un Vector) Tamao de array negativo Uso de una referencia nula Formato de nmero incorrecto Indice usado en un String est fuera de lmites
M. Aldea y M. Gonzlez 29/03/10
Prcticas de Programacin
15
16
Prcticas de Programacin
17
18
19
20
21
Tema 4. Tratamiento de errores 4.6 Usar nuestras propias excepciones Ejemplo de uso de excepciones propias: Curso (cont.)
...
// otros mtodos
/** * aade un alumno al curso. * @throws Completo cuando no se pueden * matricular ms */ public void aadeAlumno(Alumno a) throws Completo{ if (numAlumnos == MxAlumnos) { throw new Completo(); } listaAlumnos[numAlumnos] = a; numAlumnos++; } ... // otros mtodos } // fin clase curso
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
22
Tema 4. Tratamiento de errores 4.6 Usar nuestras propias excepciones Ejemplo de uso de excepciones propias: Curso (cont.)
Uso de aadeAlumno desde el programa principal (la excepcin es la nica manera de detectar que el curso est completo) el que sea una excepcin comprobada nos impide ignorar por error u olvido el posible error case AADIR: try { a = pideDatosAlumno(); if (curso.buscaPorDNI(a.dni())!=null) { msj.escribe("El alumno ya existe"); } else { Puede lanzar Curso.Completo curso.aadeAlumno(a); } } catch (Curso.Completo e) { msj.escribe("No es posible aadir el " + "alumno, el curso est completo"); } break;
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
23
24
Tema 4. Tratamiento de errores 4.6 Usar nuestras propias excepciones Ejemplo de uso de excepciones propias: pila (cont.)
/** * aade un elemento sobre la cima de la pila */ public void apila(int elemento) throws Llena { if (numElementos==pila.length) throw new Llena(); pila[numElementos]=elemento; numElementos++; Al tratarse de excepciones No comprobadas } no es obligatorio poner el throws, pero le
ponemos por claridad
/** * elimina el elemento en la cima de la pila */ public int desapila() throws Vaca { if (numElementos==0) throw new Vaca(); numElementos--; return pila[numElementos]; }
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
25
Tema 4. Tratamiento de errores 4.6 Usar nuestras propias excepciones Ejemplo de uso de excepciones propias: pila (cont.)
/** * retorna verdadero si la pila est vaca */ public boolean vaca() { return numElementos==0; } /** * retorna verdadero si la pila est llena */ public boolean llena() { return numElementos==pila.length; } } // fin clase PilaDeEnteros
Prcticas de Programacin
26
Tema 4. Tratamiento de errores 4.6 Usar nuestras propias excepciones Ejemplo de uso de excepciones propias: pila (cont.)
Cdigo para desapilar el elemento en la cima de la pila: no necesitamos utilizar excepciones puesto que existe el mtodo pila.vaca() - y puesto que PilaDeEnteros.PilaVaca es una excepcin no comprobada, no es necesario el bloque try-catch an as, la excepcin servira para detectar un uso incorrecto case DESAPILAR: if (pila.vaca()) { // caso especial: pila vaca System.out.println("Pila vaca"); break; podra lanzar PilaDeEnteros.Vaca (excepcin NO comprobada) } // caso normal: pila con elementos int num = pila.desapila(); System.out.println("<- Desapilado:" + num); break;
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
27
Tema 4. Tratamiento de errores 4.6 Usar nuestras propias excepciones Ejemplo de uso de excepciones propias: pila (cont.)
Si PilaDeEnteros.PilaVaca fuera una excepcin comprobada nos obligara a utilizar el bloque try-catch (aunque slo servira para complicar ms el cdigo) case DESAPILAR: try { if (pila.vaca()) { // caso especial: pila vaca System.out.println("Pila vaca"); break; podra lanzar PilaDeEnteros.Vaca (excepcin comprobada) } // caso normal: pila con elementos int num = pila.desapila(); System.out.println("<- Desapilado:" + num); } catch (PilaDeEnteros.Vaca e) { System.out.println("Nunca ocurre!!"); } break;
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
28
29
Prcticas de Programacin
30
31
No deben usarse las excepciones en casos que no sean de error por eficiencia y porque hacen ms difcil entender el programa
No debe lanzarse una excepcin y tratarla en el mismo mtodo en lugar de lanzar la excepcin, realizar el tratamiento directamente excepto si ya hay un manejador escrito que sea adecuado
No deben usarse excepciones para realizar el control de flujo por ejemplo para salirse de un lazo o una operacin (ver ejemplos en las dos siguientes transparencias)
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
32
Tema 4. Tratamiento de errores 4.8 Utilizacin de excepciones Ejemplo de uso de excepciones propias: pila (cont.)
Forma correcta de desapilar todos los elementos de la pila la excepcin no se utiliza para controlar el flujo de control case DESAPILAR_TODOS: if (pila.vaca()) { // caso especial: pila vaca System.out.println("Pila vaca"); break; podra lanzar PilaDeEnteros.Vaca } (excepcin NO comprobada) // caso normal: pila con elementos do { int num=pila.desapila(); System.out.println("<- Desapilado:"+num); } while (!pila.vaca()); break;
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
33
Tema 4. Tratamiento de errores 4.8 Utilizacin de excepciones Ejemplo de uso de excepciones propias: pila (cont.)
Forma incorrecta de desapilar todos los elementos de la pila la excepcin se utiliza para controlar el flujo de control case DESAPILAR_TODOS_MAL: if (pila.vaca()) { System.out.println("Pila vaca"); break; } do { try { int num=pila.desapila(); System.out.println("<- Desapilado:"+num); } catch (PilaDeEnteros.Vaca e) { break; } } while (true);
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
34
35
Tema 4. Tratamiento de errores 4.8 Utilizacin de excepciones Excepciones comprobadas vs. no comprobadas (cont.)
Tambin utilizaremos excepciones no comprobadas para errores internos ante los que el usuario de la clase poco puede hacer: - fallos en precondiciones de mtodos privados - fallos en postcondiciones en mtodos pblicos o privados
Prcticas de Programacin
36
37
Tema 4. Tratamiento de errores 4.8 Utilizacin de excepciones Reutilizacin de excepciones predefinidas (cont.)
/** retorna el nmero complejo resultado de la * divisin: dividendo/divisor */ public static Complejo divisin(Complejo dvdo, Complejo dvsor) { if (dvsor.r==0.0 && dvsor.i==0.0) throw new ArithmeticException("/ por Complejo(0,0)"); Complejo cociente = new Complejo(0,0); cociente.r=(dvdo.r*dvsor.r + dvdo.i*dvsor.i)/ (dvsor.r*dvsor.r + dvsor.i*dvsor.i); cociente.i=(-dvdo.r*dvsor.i + dvdo.i*dvsor.r)/ (dvsor.r*dvsor.r + dvsor.i*dvsor.i); return cociente; } ... // otros mtodos } // fin clase Complejo
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
38
Esquema de tratamiento de un error leve try { instrucciones } catch (ClaseExcepcin e) { notificacin del error leve }
Prcticas de Programacin
39
Tema 4. Tratamiento de errores 4.8 Utilizacin de excepciones Patrones de tratamiento de excepciones (cont.)
Esquema de tratamiento de un error grave try { instrucciones } catch (ClaseExcepcin e) { notificacin del error grave System.exit(-1); // finaliza la aplicacin } Esquema de tratamiento de error recuperable while (true) { try { instrucciones a reintentar break o return } catch (ClaseExcepcin e) { manejador } }
Prcticas de Programacin M. Aldea y M. Gonzlez 29/03/10
40
41
42
4.9 Bibliografa
Ken Arnold, James Gosling, David Holmes, El lenguaje de programacin Java, 3 edicin. Addison-Wesley, 2000. The Java Tutorials. Lesson: Exceptions. http://java.sun.com/docs/books/tutorial/essential/ exceptions/index.html Francisco Gutirrez, Francisco Durn, Ernesto Pimentel. Programacin Orientada a Objetos con Java. Paraninfo, 2007. Eitel, Harvey M. y Deitel, Paul J., Cmo programar en Java, quinta edicin. Pearson Educacin, Mxico, 2004. King, Kim N. Java programming: from the beginning. W. W. Norton & Company, cop. 2000
Prcticas de Programacin
43