Parte I: Programación en un lenguaje orientado a objetos ,QWURGXFFLyQDORVOHQJXDMHVGHSURJUDPDFLyQ 'DWRV\H[SUHVLRQHV (VWUXFWXUDVDOJRUtWPLFDV 'DWRVFRPSXHVWRV 0RGXODULGDG 7UDWDPLHQWRGHHUURUHV • Excepciones. Bloques de tratamiento excepciones. La cláusula finally. Patrones de tratamiento de excepciones. Jerarquía de las excepciones. Lanzar excepciones. Usar nuestras propias excepciones (QWUDGDVDOLGD +HUHQFLD\3ROLPRUILVPR www.istr.unican.es © Michael González Harbour, 19/abr/16 1 81,9(56,'$' '(&$17$%5,$ Excepciones 6RQXQPHFDQLVPRHVSHFLDOSDUDJHVWLRQDUHUURUHV 3HUPLWHQVHSDUDUHOWUDWDPLHQWRGHHUURUHVGHOFyGLJRQRUPDO (YLWDQTXHKD\DHUURUHVTXHSDVHQLQDGYHUWLGRV 3HUPLWHQSURSDJDUGHIRUPDDXWRPiWLFDORVHUURUHVGHVGHORV PpWRGRVPiVLQWHUQRVDORVPiVH[WHUQRV 3HUPLWHQDJUXSDUHQXQOXJDUFRP~QHOWUDWDPLHQWRGHHUURUHVTXH RFXUUHQHQYDULRVOXJDUHVGHOSURJUDPD (Q-DYDVRQFODVHVHVSHFLDOHV /DVH[FHSFLRQHVVHODQ]DQSDUDLQGLFDUTXHKDRFXUULGRXQHUURU DXWRPiWLFDPHQWHFXDQGRHOVLVWHPDGHWHFWDXQHUURU H[SOtFLWDPHQWHFXDQGRHOSURJUDPDGRUORHVWDEOH]FD (VWiQSUHVHQWHVHQORVOHQJXDMHVPiVPRGHUQRV www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 2 Conceptos asociados a las excepciones /DQ]DU /DH[FHSFLyQVHODQ]DSDUDDYLVDUGHTXHKD\XQHUURU - automáticamente - o explícitamente con la instrucción throw 3URSDJDU /DH[FHSFLyQVHSURSDJDGHXQEORTXHDOVLJXLHQWHKDVWDVHWUDWD 7UDWDU (MHFXWDUODVLQVWUXFFLRQHVGHXQPDQHMDGRUGHH[FHSFLyQ - para resolver la situación de error 0DQHMDGRU ,QVWUXFFLRQHVTXHVHHVFULEHQSDUDUHVROYHUXQHUURU www.istr.unican.es © Michael González Harbour, 19/abr/16 3 81,9(56,'$' '(&$17$%5,$ Ej. de lanzamiento automático: División por cero import fundamentos.*; public class DivisionPorCero { public static void main(String[] args) { int i, j, div; Lectura leer = new Lectura("Enteros"); leer.creaEntrada("i",0); leer.creaEntrada("j",0); leer.espera("introduce datos"); i=leer.leeInt("i"); j=leer.leeInt("j"); System.out.println("Divide..."); div = i/j; System.out.println("i/j="+div); } // fin main } // fin DivisionPorCero www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 ĐƵĂŶĚŽ jǀĂůĞϬƐĞůĂŶnjĂ ůĂĞdžĐĞƉĐŝſŶ ArithmeticException ĐƵĂŶĚŽƐĞůĂŶnjĂůĂĞdžĐĞƉĐŝſŶ ĞƐƚĂůşŶĞĂŶŽƐĞĞũĞĐƵƚĂ 4 Propagación de excepciones Se lanza excepción m1() } m1() { { } } www.istr.unican.es Se abortan instrucciones restantes del bloque ¿Hay manejador? NO En el siguiente bloque main() { SI Se ejecuta manejador Fin excep., sigue siguiente bloque © Michael González Harbour, 19/abr/16 5 81,9(56,'$' '(&$17$%5,$ Propagación de excepciones 8QDOtQHDGHFyGLJRODQ]DXQDH[FHSFLyQ (OEORTXHTXHFRQWLHQHHVDOtQHDGHFyGLJRVHDERUWDHQHVHSXQWR 6LHOEORTXHWUDWDHVDH[FHSFLyQHVGHFLUVLWLHQHXQPDQHMDGRUSDUD HOODHOPDQHMDGRUVHHMHFXWD OD³YLGD´GHODH[FHSFLyQILQDOL]DHQHVWHSXQWR 6LQRWLHQHPDQHMDGRUODH[FHSFLyQVHSURSDJDDOEORTXHVXSHULRU TXHDVXYH]SRGUiWUDWDURGHMDUSDVDUODH[FHSFLyQ 6LODH[FHSFLyQDOFDQ]DHOEORTXHSULQFLSDOmain\pVWHWDPSRFRWUDWD ODH[FHSFLyQHOSURJUDPDILQDOL]DFRQXQPHQVDMHGHHUURU www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 6 Ejemplo de propagación de excepciones private static int divide(int a, int b) { System.out.println("divide: antes de dividir"); int div = a/b; System.out.println("divide: después de dividir"); return div; } private static void intermedio() { System.out.println("intermedio: antes de divide"); int div = divide(2,0); System.out.println("intermedio: resultado:" +div); } public static void main(String[] args) { System.out.println("main: antes de intermedio"); intermedio(); System.out.println("main: después de intermedio"); } www.istr.unican.es © Michael González Harbour, 19/abr/16 7 81,9(56,'$' '(&$17$%5,$ Ejemplo de propagación de excepciones 6LKD\GLYLVLyQSRUFHURODVDOLGDJHQHUDGDVHUi 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) www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 8 Bloques de tratamiento de excepciones /DIRUPDJHQHUDOGHHVFULELUXQEORTXHHQHOTXHVHWUDWDQH[FHSFLRQHV HV eĞƐĞůŽďũĞƚŽƋƵĞ ƌĞƉƌĞƐĞŶƚĂůĂĞdžĐĞƉĐŝſŶ try { instrucciones; } catch (ClaseExcepción1 e) { instrucciones de tratamiento; } catch (ClaseExcepción2 | ClaseExcepción3 e) { instrucciones de tratamiento; } /RV³catch´VHHYDO~DQSRURUGHQ XQDH[FHSFLyQVHWUDWDHQHOSULPHU³catch´SDUDHVDH[FHSFLyQR SDUDXQDGHVXVVXSHUFODVHV 'HVGH-DYDVHSHUPLWHQP~OWLSOHVH[FHSFLRQHVHQXQ³catch´ www.istr.unican.es © Michael González Harbour, 19/abr/16 9 81,9(56,'$' '(&$17$%5,$ Ejemplo: propagación con bloque trycatch (QHOHMHPSOR³SURSDJDFLyQGHH[FHSFLRQHV´DQWHULRUDxDGLPRVXQ EORTXHtry-catchDOPpWRGRLQWHUPHGLR private static void intermedio() { try { System.out.println("intermedio: antes de " + "divide"); int div=divide(2,0); System.out.println("intermedio: resultado:" + div); } catch (ArithmeticException e) { System.out.println("intermedio: tratado error " + e); } } www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 10 Ejemplo: propagación con bloque trycatch /DVDOLGDSRUFRQVRODTXHREWHQHPRVDKRUDHV main: antes de intermedio intermedio: antes de divide divide: antes de dividir intermedio: cazada ArithmeticException: / by zero main: después de intermedio HQHVWHFDVRODH[FHSFLyQHVWUDWDGDSRUORTXH - el programa NO finaliza de forma abrupta - NO aparece un mensaje del sistema indicando que se ha producido una excepción www.istr.unican.es © Michael González Harbour, 19/abr/16 11 81,9(56,'$' '(&$17$%5,$ Tratamiento específico 7UDWDPLHQWR~QLFDPHQWHGHODH[FHSFLyQArithmeticException try { ...; } catch (ArithmeticException e) { ...; } (VSRVLEOHSRQHUXQWUDWDPLHQWRFRP~QSDUDFXDOTXLHUH[FHSFLyQ try { ...; } catch (Exception e) { ...; } HVFyPRGRSHURQRHVUHFRPHQGDEOH\DTXHSXHGHRFXUULUXQ WUDWDPLHQWRLQDGHFXDGRSDUDXQDH[FHSFLyQQRSUHYLVWD www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 12 La cláusula finally 3HUPLWHFUHDUXQEORTXHGHFyGLJRTXHVHHMHFXWDVLHPSUHGHVSXpVGHO EORTXHtry-catch KD\DKDELGRH[FHSFLyQRQR LQFOXVRVLVHVDOHDFDXVDGHreturnbreakRcontinue try { operaciones; } catch (ClaseExcepción1 e) { tratamiento de la excepción; } catch (ClaseExcepción2 e) { tratamiento de la excepción; } finally { siempre; } ODFOiXVXODfinallyHVRSFLRQDO www.istr.unican.es © Michael González Harbour, 19/abr/16 13 81,9(56,'$' '(&$17$%5,$ Patrones de tratamiento de excepciones 6HJ~QODJUDYHGDGGHOHUURU OHYHVHQRWLILFDHOHUURUSHURODDSOLFDFLyQFRQWLQ~D JUDYHVHQRWLILFDHOHUURU\VHILQDOL]DXQDSDUWHGHODDSOLFDFLyQR ODDSOLFDFLyQFRPSOHWD UHFXSHUDEOHVHUHLQWHQWDODRSHUDFLyQ www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 14 Patrones de tratamiento de excepciones (VTXHPDGHWUDWDPLHQWRGHXQHUURUOHYH try { instrucciones } catch (ClaseExcepción e) { notificación del error leve } www.istr.unican.es © Michael González Harbour, 19/abr/16 15 81,9(56,'$' '(&$17$%5,$ Patrones de tratamiento de excepciones (VTXHPDGHWUDWDPLHQWRGHXQHUURUJUDYH try { instrucciones } catch (ClaseExcepción e) { notificación del error grave System.exit(-1); // finaliza la aplicación } (QRWUDVRFDVLRQHVVHILQDOL]DVyORHOPpWRGRFRQreturnRVHODQ]D RWUDH[FHSFLyQFRQthrow www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 16 Patrones de tratamiento de excepciones (VTXHPDGHWUDWDPLHQWRGHHUURUUHFXSHUDEOH boolean correcto = false do { try { instrucciones a reintentar correcto = true } catch (ClaseExcepción e) { tratamiento } } while (!correcto); www.istr.unican.es © Michael González Harbour, 19/abr/16 17 81,9(56,'$' '(&$17$%5,$ Ejemplo de error recuperable: lee dos notas double nota1, nota2; boolean notasCorrectas = false; Lectura lec = new Lectura("Lee notas"); lec.creaEntrada("Nota parcial 1",5.0); lec.creaEntrada("Nota parcial 2",5.0); do { lec.esperaYCierra("Introduce notas"); try { nota1=lec.leeDouble("Nota parcial 1"); nota2=lec.leeDouble("Nota parcial 2"); notasCorrectas = true; // sale del bucle } catch (NumberFormatException e) { // no muestra mensaje de error porque ya // lo hace leeDouble } } while (!notasCorrectas); www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 18 Jerarquía de las excepciones 7KURZDEOH VHSXHGHQ WUDWDU QRVHWUDWDQ ([FHSWLRQ (UURU QRHV REOLJDWRULR WUDWDUODV 5XQWLPH([FHSWLRQ Excepción de Usuario HV REOLJDWRULR WUDWDUODV 7DPELpQGHQRPLQDGDV ([FHSFLRQHVFRPSUREDGDV RuntimeException de Usuario 7DPELpQGHQRPLQDGDV ([FHSFLRQHVQRFRPSUREDGDV www.istr.unican.es © Michael González Harbour, 19/abr/16 19 81,9(56,'$' '(&$17$%5,$ Algunas excepciones RuntimeException 7DPELpQVHGHQRPLQDQH[FHSFLRQHVQRFRPSUREDGDV ArithmeticException (UURUDULWPpWLFR[ ArrayIndexOutOfBoundsException ËQGLFHGHDUUD\IXHUDGHOtPLWHV R! OHQJWK ClassCastException ,QWHQWRGHFRQYHUWLUDXQDFODVHLQFR UUHFWD IndexOutOfBoundsException ËQGLFHIXHUDGHOtPLWHVSHHQXQ $UUD\/LVW NegativeArraySizeException 7DPDxRGHDUUD\QHJDWLYR NullPointerException 8VRGHXQDUHIHUHQFLDQXOD NumberFormatException )RUPDWRGHQ~PHURLQFRUUHFWR StringIndexOutOfBounds ËQGLFHXVDGRHQXQ6WULQJHVWiIXHUDGH OtPLWHV www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 20 Lanzar excepciones 6HODQ]DQFRQODSDODEUDUHVHUYDGDthrow throw new ClaseExcepción(); (QRFDVLRQHVSXHGHVHUPiVFRQYHQLHQWHXVDUHOFRQVWUXFWRUFRQXQ VWULQJFRPRSDUiPHWUR throw new ClaseExcepción("mensaje"); TXHVLUYHSDUDGDULQIRUPDFLyQDGLFLRQDOVREUHODFDXVDGHOD H[FHSFLyQ (MHPSOR if (clave==null) { throw new NullPointerException("clave es nula"); } www.istr.unican.es © Michael González Harbour, 19/abr/16 21 81,9(56,'$' '(&$17$%5,$ Lanzar la misma excepción (QDOJXQDVRFDVLRQHVXQPDQHMDGRUSXHGHYROYHUDODQ]DUODPLVPD H[FHSFLyQ catch (ClaseExcepción e) { parte del tratamiento de la excepción; throw e; } SXHGHVHU~WLOFXDQGRVHGHVHDUHDOL]DUHQHOPDQHMDGRUSDUWHGHO WUDWDPLHQWRGHODH[FHSFLyQ - y dejar que el resto del tratamiento le haga el método superior www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 22 Usar nuestras propias excepciones (OSURJUDPDGRUSXHGHFUHDUVXVSURSLDVH[FHSFLRQHV\XWLOL]DUODVSDUD LQGLFDUHUURUHV public class MiExcepción extends Exception {} /DVH[FHSFLRQHVFUHDGDVSRUHOSURJUDPDGRUTXHH[WLHQGHQDODFODVH Exception VRQH[FHSFLRQHVFRPSUREDGDV 8QPpWRGRGRQGHVHODQ]DXQDH[FHSFLyQFRPSUREDGDGHEHUi WUDWDUODFRQXQEORTXHtry-catch RGHFODUDUHQVXFDEHFHUDTXHODODQ]DFRQXQDFOiXVXODthrows www.istr.unican.es © Michael González Harbour, 19/abr/16 23 81,9(56,'$' '(&$17$%5,$ Sintaxis de la cláusula throws public tipo nombreMétodo(parámetros) throws ClaseExcepción1, ClaseExcepción2 { declaraciones; instrucciones; // lanzan las excepciones } www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 24 Ejemplo de excepción propia &ODVHTXHGHILQHODH[FHSFLyQ public class NoQuieroTrabajar extends Exception {} www.istr.unican.es © Michael González Harbour, 19/abr/16 25 81,9(56,'$' '(&$17$%5,$ Ejemplo de excepción propia 2SHUDFLyQTXHODQ]DODH[FHSFLyQ public class Operador { public String trabaja(String diaSemana) throws NoQuieroTrabajar { if (diaSemana.equals("Miercoles")) { return "OK. voy a trabajar"; } // si no es miércoles throw new NoQuieroTrabajar(); } } www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 26 Ejemplo de excepción propia 2SHUDFLyQTXHLQYRFDDtrabaja()\QRODWUDWD public void mandaPepe() throws NoQuieroTrabajar { pepe.trabaja("viernes"); } www.istr.unican.es © Michael González Harbour, 19/abr/16 27 81,9(56,'$' '(&$17$%5,$ Ejemplo de excepción propia 2SHUDFLyQTXHLQYRFDDtrabaja()\ODWUDWD public void mandaJuan() { try { juan.trabaja("miércoles"); } catch (NoQuieroTrabajar e) { System.out.println ("Juan no quiere trabajar"); } } www.istr.unican.es 81,9(56,'$' '(&$17$%5,$ © Michael González Harbour, 19/abr/16 28