LOGRO DE LA UNIDAD DE APRENDIZAJE sobrescribiendo métodos que atrapan y lanzan excepciones. TEMARIO Manejo de excepciones usando las sentencias Try, Catch y Finally Propagación de excepciones Definición de excepciones y jerarquía de Excepciones Manifiesto de excepciones e interfaces públicas Yerros y excepciones comunes · Assertions - Definición Configuración del uso de Assertion Buenas prácticas del uso de Assertions ACTIVIDADES PROPUESTAS excepciones. usando bloques TRY ? CATCH ? FINALLY. 1. Gestión de excepciones en Java gestor de excepciones de java. de probables excepciones. 1.1 Sentencias TRY - CATCH de recursos, entre otros. excepción lanzada. se presenta un ejemplo. try { // Aquí colocamos código que podría arrojar cierta excepción. catch(MiPrimeraExcepcion) { // Aquí colocamos código que gestiona la excepción catch(MiSegundaExcepcion) { // Aquí colocamos código que gestiona la excepción // Aquí colocamos código que no es riesgoso MiPrimeraExcepcion. Imaginemos ahora que poseemos el próximo código: try { obtenerArchivoDeLaRed leerArchivoYCargarTabla catch(NoPuedeObtenerArchivoDeLaRed) { mostrarMensajeDeErrorDeRed tabla. Esto se debe a que la operación previa ya lanzó una excepción. 1.2 La condicion Finally inicializados ocurra o no ocurra una excepción. incluso, si tiene lugar una sentencia return dentro del bloque TRY: encontrada y antes de que la sentencia return sea ejecutada?. ejecutará después de que se haya completado el bloque CATCH respectivo. TRY, CATCH y FINALLY. //El próximo código presenta el uso de TRY y FINALLY: try { // realizar algo finally { //clean up //El próximo código presenta el uso de TRY, CATCH y FINALLY: try { // realizar algo catch (SomeException ex) { // do exception handling finally { // clean up //El próximo código es inválido: try { // realizar algo // Se requiere un CATCH o un FINALLY aquí System.out.println("fuera del bloque try"); //El próximo código es inválido: try { // realizar algo // No se puede tener código entre una TRY y un CATCH System.out.println("fuera del bloque try"); catch(Exception ex) { 1.3 Propagación de excepciones 1.3.1 Pila de llamadas aspecto mainLa pila de llamadas entretanto el método 3 está ejecutándose: Metodo3() El método 2 invoca al método 3 Metodo2() El método 1 invoca al método 2 Metodo1() main invoca al método 1 Main() main comienza la ejecución Orden en el cual los métodos son colocados en la pila de llamadas La pila de llamadas después de terminar la ejecución del método 3. Metodo2() Se completará el método 2 Metodo1() Se completará el método 1 Main() Se completará el método main y la JVM hará un exit Orden en el cual los métodos completan su ejecución 1.3.2 Esquema de propagación de excepciones baja de la pila. Esto se conoce como propagación de excepciones ayudará a realizar un ?debug? excepción fuese lanzada y qué método la lanzó. 1.4 Definiendo excepciones argumento de la condicion CATCH. A continuación, se presenta un ejemplo: try { // colocamos determinado código aquí catch (ArraylndexOutOfBoundsException e) { e.printStackTrace(); invocar a cualquiera de sus métodos. 1.5 Jerarquía de excepciones clase se deriva de la clase Throwable (la cual deriva de la clase Object). Throwable: Exceptio Errorepresentan situaciones inusuales que proyecto ejecución del programa, como por ejemplo, ?JVM running out of memory?. técnicamente, no son excepciones Exception. complicados de gestionar. Existen dos formas de conseguir información relacionada con una excepción: condicion CATCH). · La segunda, es obteniéndola del mismo objeto Exception. printStackTrace() imprimiendo el nombre de cada uno de los métodos en la pila de llamadas. 1.6 Gestionando una jerarquía completa de Excepciones A continuación, se presenta un ejemplo: try { // Algun codigo que pueda arrojar una boundary exception catch (IndexOutofBoundsException e) { e.printStackTrace (); Se podrán atrapar excepciones de los tipos ArrayIndexOutOf BoundsExceptio or StringIndexOutOfBoundsException una excepción específica. presenta a continuación: try { // some code catch (Exception e) { e.printStackTrace(); debido a que sólo contamos con una condicion CATCH. Ejemplo particular, necesitaremos escribir sólo dos condiciones catch. import java.io.*; public class ReadData { public static void main(String args[]) { try { RandomAccessFile raf = new RandomAccessFile("myfile.txt", "r"); byte b[] = new byte[1000]; raf.readFully(b, 0, 1000); catch(FileNotFoundException e) { System.err.println("File not found"); System.err.println(e.getMessage()); e.printStackTrace(); catch(IOException e) { System.err.println("IO Error"); System. err. println(e. toString()); e.printStackTrace(); y la excepción será propagada hacia bajo ubicada sobre la de IOException. Si lo hacemos al revés, el proyecto compilará. A continuación se presenta un ejemplo: try { // do risky IO things catch (IOException e) { // handle común IOExceptions catch (FileNotFoundException ex) { // handle just FileNotFoundException Obtendremos un yerro de compilación parecida al siguiente: TestEx.java:15: exception java.io.FileNotFoundException habéis already been caught catch (FileNotFoundException ex) { Ejercicios de aplicación: 1. Dado el próximo código: class Plane { static String s = "-"; void s3() throws Exception { throw new Exception(); void s2() throws Exception { s3(); s += "2"; s3(); s += "2b"; void s1() { try { s2(); catch (Exception e) { s += "c"; public static void main(String[] args) { new Plane().s1(); System.out.println(s); ¿Cuál será el fruto de su ejecución a) b) -cc) -c2 d) -2c e) -c22b f) -2c2b ) -2c2bc h) Compilation fails Respuesta: 2. Dada la próximo sentencia: try { int x = Integer.parselnt("two"); adecuadamente: a) ClassCastException b) IllegalStateException c) NumberFormatException d) IllegalArgumentException e) ExceptionInInitializerError f) ArrayIndexOutOfBoundsException Respuesta: NumberFormatException 3. Dado el próximo código: class Plane { public static void main(String[] args) { String s = "-"; switch (TimeZone.CST) { case EST: s += "e"; case CST: s += "c"; case MST: s += "m"; default: s += "X"; case PST: s += "p"; System.out.println(s); enum TimeZone { EST, CST, MST, PST ¿Cuál será el fruto de su ejecución b) -Xd) -cmp f) Compilation fails. ) An exception is thrown at runtime. Respuesta -cmXp2. Excepciones y yerros comunes en Java 2.1 Origen de las excepciones éstas. Existen dos categorías básicas: · Excepciones de la JVM. la Java Virtual Machine. · Excepciones programáticas. excplícitamente por la aplicación y/o APIs particulares del desarrollador. 2.2 Excepciones lanzadas por la JVM ejemplo: class NPE { static String s; public static void main(String[] args) { System.out.println(s.length()); lanzará un NullPointerException cuando trate de invocar al método length() Ejemplo: void go() { // Aplicación errada de recursividad go(); excepción stackOverflowError. Nuevamente, sólo la JVM ocurre este momento y la JVM será la fuente de este error. 2.3 Excepciones lanzadas programáticamente numéricos primitivos. contexto: int parseInt(String s) throws NumberFormatException { boolean parseSuccess = false; int result = 0; // se implementa la lógica de la conversion if (!parseSuccess) // si la conversion falló throw new NumberFormatException(); return result; IllegalArgumentException. caen dentro de la categoría de excepciones generadas programáticamente. 2.4 Resumen de excepciones y yerros comunes generados por una aplicación java. Descripción y Fuentes de Excepciones comunes Excepción Descripción Lanzada generalmente por: ArrayIndexOutOfBoundsException Lanzada cuando se intenta alcanzar a un arreglo con un valor de índice inválido (sea éste negativo o sobresaliente a la extensión del arreglo) JVMClassCastException Lanzada cuando intentamos convertir una referencia a variable a un tipo que falla la prueba de casteo IS-A JVMIllegalArgumentException Lanzada cuando un método recibe un argumento formateado de forma distinto a lo que el método esperaba. Programáticamente IllegalStateException Lanzada cuando el estado del ámbito no coincide con la operación que se intenta ejecutar. Por ejemplo, usar un objeto de la clase Scanner que ha sido cerrado previamente. Programáticamente NullPointerException Lanzada cuando intentamos alcanzar a un objeto con una variable de referencia cuyo valor actual es null JVMNumberFormatException Lanzada cuando un método que convierte un String a un número recibe un String que no puede ser convertido. Programáticament AssertionError Lanzada cuando una sentencia Boolean retorna el valor falso después de ser evaluada. Programáticament ExceptionInInitializerError Lanzada cuando intentamos inicializar una variable estática o un bloque de inicialización JVMStackOverflowError Típicamente lanzada cuando un método es invocado demasiadas veces, por ejemplo, recursivamente JVMNoClassDefFoundError Lanzada cuando la JVM no puede colocar una clase que necesita, por un yerro de línea de comando, dificultades de classpath, o un archivo class perdido JVMEjercicios de aplicación: 1. Dado la próximo clase: class Circus { public static void main(String[] args) { int x = 9; int y = 6; for(int z = 0; z 6; z++, y--) { if(x > 2) x--; label: if(x > 5) { System.out.print(x + ; --X; continue label; X--; ¿Cuál será el fruto de su ejecución a) 8b) 8 7 c) 8 7 6 d) Compilation fails. e) An exception is thrown at runtime. Respuesta: 2. Dada la próximo clase class Mineral { class Gem extends Mineral { class Miner { static int x = 7; static String s = null; public static void getWeight(Mineral m) { int y = 0 / x; System.out.print(s + ); public static void main(String[] args) { Mineral[] ma = { new Mineral(), new Gem() ; for (Object o : ma) getWeight((Mineral) o); Y la próximo línea de comando: java Miner.java ¿Cuál será el fruto de su ejecución? a) null b) null null c) A ClassCastException is thrown. d) A NullPointerException is thrown. e) A NoClassDefFoundError is thrown. f) An ArithmeticException is thrown. ) An IllegalArgumentException is thrown. h) An ArrayIndexOutOfBoundsException is thrown null null Resumen unchecked). excluyendo las clases que heredan de RuntimeException. ? CATCH más adecuada. tanto el compilador no forzará la gestión o manifiesto de norma alguna. la manifiesto de cierta norma para la excepción. Preguntas: ¿Qué es el gestor de excepciones de java? ¿Qué es una excepción o evento excepcional en Java? ¿Qué es un try catch en Java? ¿Qué es un finally en Java? ¿Qué es la pila de llamada? ¿Qué es la propagación de exepciones? ¿Jerarquía de Excepciones en Java? ¿Cómo gestionar una jerarquía completa de Excepciones? ¿cuál es el inicio de las excepciones? ¿Cómo se clasifican las excepciones? ¿Cuáles son las excepciones y yerros más comunes?