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