Certificación java 6 cap 5

77
Certificación Java 6 Capítulo 5 - Flujos de control, excepciones y aserciones

Transcript of Certificación java 6 cap 5

  • 1. Certificacin Java 6Captulo 5 - Flujos de control, excepciones yaserciones

2. SENTENCIAS IF YSWITCHCubre el objetivo:2.1 Develop code that implements an if or switchstatement; and identify legal argument types for thesestatements. 3. Sentencia if - else La sentencia bsica es: El else es algo opcional, no es obligatoriousarlo. Los corchetes tambin son opcionales, esimportante tener en cuenta que sin losconchetes solo se ejecuta la lnea inmediataal if En el caso de que x sea menorque 3, no se ejecuta la lneainmediata al if, pero las dems si 4. Sentencia if - else Es importante aclarar que aunquepuede ir if sin else, no se puede quehalla un else sin if. Tambin se puede usar un else if paraahorrar lneas y simplificar el cdigo 5. Expresiones legales para lassentencias if Siempre en un if debe evaluarse unbooleano, ya sea una asignacin, unacomparacin o un mtodo Suponiendo que trueInt vale 1, y falseInt vale0, entonces:Sentencia Resultadoif (trueInt) Ilegal, el if no puede evaluar un intif (trueInt == true)if (falseInt == false)Ilegal, trueInt y falseInt no esboolean, no se pueden compararif (1) 1 no es booleano, es ilegalif (trueInt == 1)if (falseInt == 0)TrueInt es entero y vale 1, soniguales, el resultado es true, y eslegal 6. Asignaciones en un if En un if se pueden usar asignaciones, pero solo si seusa una variable booleana (o el wrapper Boolean), y elresultado siempre es true, por lo tanto siempre entradentro de la sentencia.La sentencia compila, porqueboo es booleano, en el if boo sele asigna a true, y se ejecuta elbloque del if.La sentencia no compila, porquex es int, se necesita solo boolean 7. La sentencia switch La forma bsica del switch es: El switch solo puede evaluar expresiones de tipochar, byte, short, int y Enum. La expresin no compila sise usa un tipo de variable diferente inclusive long, floaty double. Conclusin la expresin debe ser compatiblecon int o un Enum. Por otro lado el valor del case debe ser una constanteen tiempo de ejecucin, esto significa que solo sepueden usar constantes o variables final que tienenasignadas un valor. a es una constante que vale 1,por lo tanto compila en estepuntob es una variable que aunque es finalno esta inicializada como constante,por lo tanto aqu no compila y arrojaerror 8. La sentencia switch Tambin hay que tener en cuenta elalcance de una variable. Por otro lado no pueden existir dos casoscon el mismo valor En los switch se pueden usarwrappers y manejar outboxingAunque g es byte y es vlido por elswitch, el compilador sabe que 128 esmayor que el tamao mximo de unavariable byte, y arroja error de compilacinEn este punto se presenta un error decompilacin, porque el caso 80 ya sepresent, esta repetido 9. La sentencia switch Cuando se usa un case la nica formade detener la sentencia es con unbreak, si no existe el sistema sigueejecutando los otros casos hastaterminar el switchComo no hay un break entonces seejecutan todos los casos despus delgreen, el resulado es:Green blue done 10. La sentencia switch Por ltimo, se puede decir que el casodefault no va de ltimoobligatoriamente: 11. CICLOS E ITERACIONESCubre el objetivo2.2 Develop code that implements all forms of loops anditerators, including the use offor, the enhanced for loop (for-each), do, while, labels, break, and continue; and explainthe values takenby loop counter variables during and after loop execution. 12. Uso del ciclo while La forma bsica es: En el while se maneja la mismafilosofa que se explic en la sentenciaif. Solo se pueden manejar booleanosSentencia Explicacinint x = 1;while (x) { }No compila porque x no es booleano esenteroint x = 1;while (x = 5) { }No compila, para que funcione x debeser booleabowhile (x == 5) { } Es valido, es una prueba de igualdadwhile (true) { } Compila, se usa un booleano, elproblema es que el ciclo nunca termina 13. El cliclo while En el ciclo while solo se pueden usarvariables que sean declaradaspreviamenteEsto es un error de compilacin porquefuera que se esta evaluando un entero yno un booleano, se esta declarando dentrodel mismo while 14. El ciclo do Este ciclo es igual al while si no que laevaluacin se hasta hasta el final delbloque, por lo tanto siempreentra, ejecuta el bloque y despusevala el resultado Al final de la sentencia (despus delwhile), siempre debe haber un punto yEl bloque siempre se ejecuta porlo menos una vez, en este casoimprime Inside loop, y luego seda cuenta que es falso y noejecuta ms. 15. El ciclo for bsico El for bsico esta compuesto de trespartes: La declaracin e inicializacinde variables, la expresin booleana yla condicin de iteracin. Estas tres secciones estn separadaspor puntos y comas. Se pueden declarar e inicializar variasvariables del mismo tipo, y se separancon comas 16. El ciclo for bsico Es importante ponerle atencin alalcance de las variables de los for. En la seccin de condicionales solo sepuede usar una sola condicin.El alcance de la variable x es solopara el for, por lo tanto existe unerror de compilacin, porque seusa despus de los corchetesSentencia Explicacinfor (int x = 0; ((((x < 10) && (y-- > 2)) | x== 3)); x++) { }Solo existe una sola condicin, es algocompleja pero es solo una, por lo tantocompilafor (int x = 0; (x > 5), (y < 2); x++) { } Existen dos condiciones diferentes, nocompila 17. El ciclo for bsico La ltima seccin es una accin que seejecuta en cada ciclo, no es necesarioque sea un booleano ni que evalu unaexpresin Los for requieren las tres secciones, asise usen o no, por ejemploEste ciclo for tiene las tressecciones, aunque no lasdeclaran, en este caso sevuelve un ciclo infinitoLa sentencia compila, y seejecuta sin ningnproblema, el resultado esiterateiterate 18. El for bsico El ciclo for puede tener variasdeclaraciones en la primeraseccin, para la segunda seccin solose puede usar una sola condicional, yen la tercera varias condicionalesDeclaracin de variasvariables de un mismo tipoUna sola condicionalcompuestaSe manejan doscondicionales separadaspor comas 19. El for avanzado Existe un for especializado para losarrays y las colecciones. La expresin esta compuesta de dospartes: La declaracin: La variable es nueva, y debeser compatible con los tipos de elementosque componen el arreglo, y es al que se leasignan los elementos dentro del ciclo. La expresin: Indica el array que se quiereEste for simplificadopermite recorrer lacoleccin 20. El for avanzado De acuerdo a lo siguiente:int x;long x2;Long [] La = {4L, 5L, 6L};long [] la = {7L, 8L, 9L};int [][] twoDee = {{1,2,3}, {4,5,6}, {7,8,9}};String [] sNums = {"one", "two", "three"};Animal [] animals = {new Dog(), new Cat()};Usos legales Usos ilegalesfor(long y : la ) ;for(long lp : La) ;for(int[] n : twoDee) ;for(int n2 : twoDee[2]) ;for(String s : sNums) ;for(Object o : sNums) ;for(Animal a : animals) ;for(x2 : la) ;for(int x2 : twoDee) ;for(int x3 : la) ;for(Dog d : animals) ; 21. Break, return y continue Existen formas para romper el ciclo, y se puede hacerde varias formas, cada una tiene un alcance y uncomportamiento distinto. Break: Esta sentencia detiene inmediatamente laejecucin del ciclo y continua en la lnea inmediatadespus del bloque. Esta sentencia se puede usar enciclos y en switch Continue: Esta sentencia solo se puede usar en losciclos, y sirve para detener una iteracin, es decirdetiene el ciclo actual y continua con la siguienteiteracin. Return: Esta instruccin si hace parte de los mtodosms que de los ciclos, y sirve para ponerle fin a unmtodo como tal, si va dentro del ciclo, pues lo terminacon mtodo y todo, a su vez tambin retorna un valor ovariable al mtodo invocador. 22. Break, return y continue Comportamiento dentro de ciclos annimos: Tanto el break como el continue tienen uncomportamiento normal en este tipo de ciclos yaque es donde se da ms comnNormalmente el ciclo se ejecutarainfinitamente pero en este caso seejecuta una sola vez pues lasentencia break rompe el cicloEn este caso pues notermina el ciclo sino lo quehace es detener laiteracin y continuar en lasiguiente. 23. Break, return y continue Sentencias marcadas: En java se puede colocar justo antes de iniciar elciclo una marca o label el cual sirve de banderapara que el break o el continue puedanejecutarse al ciclo correspondienteEs importante tener en cuenta que cuando se hace elcontinue y la marca el sistema ya no tiene en cuentalos for si no que se remite directamente al for de lamarca en este caso el primero 24. Break, return y continue Sentencias marcadas:En este caso al igual con el anterior el sistema no tiene encuenta el ciclo que esta ejecutando sino el que corresponde ala marca es decir el segundo for 25. MANEJO DEEXCEPCIONESCubre los objetivos:2.4 Develop code that makes use of exceptions and exception handlingclauses (try, catch, finally), and declares methods and overriding methods thatthrow exceptions.2.5 Recognize the effect of an exception arising at a specific point in a codefragment. Note that the exception may be a runtime exception, a checkedexception, or an error. 26. Uso del try-catchEl principal elemento para controlar las excepcioneses mediante un conjunto de sentencias llamadas trycatch, por medio de este mecanismo cada vez queocurra una excepcin o anomala en el bloque try sedirecciona directamente al bloque catch. 27. Uso del finally El finally es un bloque que va despus del catch, y se hacepara poder ejecutar un bloque de cdigo al final delprocedimiento, sin importar si se present una excepcin ono, basicamente lo que se busca es poder tener una formade colocar los objetos en un estado que no desestabilice laaplicacin despus como cerrar un socket, quitar unaconexin a una base de datos, cerrar un archivo. Importante, el bloque finally siempre va al final, ysiempre se ejecuta, ya sea despus del bloque try odespus del bloque catch, pero siempre se ejecuta 28. Formas legales de bloque trycatch finally El bloque siempre tiene que ir en elorden try - catch - finaly Tambin puede ir try - finally 29. Formas ilegales de bloque trycatch finally No se puede poner un bloque solo, tieneque ir el try con catch o con finally Tampoco se puede colocar nada entrelos bloques estos deben serconsecutivos, uno despus de otro sininterrupciones 30. Propagacin de excepciones Las excepciones una vez se producen ysi no estn controladas entonces sepropagan al mtodo que las llam y assucesivamente hasta llegar al mtodoprincipal o main. 31. rbol de herencia de lasexcepciones Todos los erroresy excepcionesheredan de laclase throwble. La diferenciaentre error yexcepcion es quelos errores sonsituaciones quecon errores deprogramacin yque no se puedencontrolar, comounoutOfMemoryError 32. rbol de herencia de lasexcepciones Una excepcin por el contrario si sepuede controlar y se da en su mayoraporque existe una condicin que nopermite la completa ejecucin de laaplicacin. De throwable se puede destacar unmtodo que se llamaprintStackTrace, este mtodo permiteimprimir toda la pila de excepcin eindica que excepcin se dispar 33. Manejando el nivel de herenciaen las excepciones Como ya dijimos las excepciones manejan unaherencia, por lo tanto el catch que se maneja enlo posible es mejor usando la excepcinespecfica que se quiere tratar, de esta forma sele dar un uso ms potente a el catch y lasaplicaciones sern mucho ms completas.La funcionalidades la mismaMejor usar esta opcinms especializada yversatil 34. Manejo de mltiplesexcepciones Como ya vimos es mejor usar un catchespecializado para cada tipo deexcepcin, sin embargo cuando unaexcepcin sucede java primero busca uncatch con la excepcin especfica, si nola encuentra entonces busca la padre yas sucesivamente. De acuerdo a esto hay que tener encuenta que no se puede poner nuncauna excepcin padre y luego una hija enel orden de los catch, si no es asentonces se tiene un error decompilacin. 35. Manejo de mltiples catchEste caso sepresenta siempreque no encuentreel archivoespecificoEste casose dacuando nopuedeescribir oleer en elarchivoespecificado 36. Manejo de mltiples catch Por otro lado es importanteespecificar que IOException espadre de FileNotFoundException,por lo tanto primero va el hijo y deltimas el padre, al Contrario eserror de compilacin 37. Uso de throws La instruccin throws va en el encabezadodel mtodo y sirve para listar las excepcionesque el mtodo puede lanzar. La sentencia anterior indica que el mtodopuede lanzar las excepciones MyException1y MyException2, al tener esta instruccin yano es necesario tratarlas con un try-catch sino que se propaga esta funcin al mtodoque lo llama. Cada mtodo debe manejar sus propiasexcepciones ya sea por medio de un catch opor medio de un throws 38. Uso de throws Para efectos de compilacin debenser tratadas todas las excepcionesque no derivan dejava.lang.RuntimeException.EOFException no deriva deRuntimeException por lo tanto tocaControlarla, en este caso se hace conThrowsNullPointerException deriva deruntimeException, por lo tantoNo es necesario para el compiladorQue este controlada y no arrojaerror de compilacin 39. Uso de excepciones propias Declarar una excepcin propia es muysencillo, lo que hay que hacer es primerodeclarar una clase que herede deException. Luego en el mtodo principal, lanzarlaen con ayuda de throw y throws, omanejarla con ayuda de try - catch 40. Uso del throw en el catch Uno puede usar un throw en un catch en vezde manejar la excepcin ah mismo, en estecaso hay que tener en cunta que tocatambin declararla usando en throws en ladeclaracin del mtodo, y si existe un finallyeste tambin se ejecuta.Error de compilacin, debe usarse un throws en ladeclaracin del mtodo para solucionarse 41. EXCEPCIONESCOMUNES Y ERRORES2.6 Recognize situations that will result in any of the followingbeing thrown:ArrayIndexOutOfBoundsException, ClassCastException, IllegalArgumentException, IllegalStateException, NullPointerException,NumberFormatException, AssertionError, ExceptionInInitializerError, StackOverflowError, or NoClassDefFoundError. Understandwhich of these are thrown by the virtual machine and recognizesituations in which others should be thrown programmatically. 42. De dnde vienen lasexcepciones?De acuerdo al objetivo de esta seccin esimportante entender que causa una excepcin oun error y de donde estas son. Para el propsitodel examen vamos a definir dos categoras:Excepciones JVM: Estas excepciones y erroresson nicamente lanzados por el Java VirtualMachineExcepciones de programacin: Estasexcepciones y errores son exclusivamentelanzadas por el desarrollados y el programa. 43. Excepciones JVM NullPointerException: Esta excepcinse dispara cuando se trata de accederun objeto que no ha sidoinicializado, y que apunta a null.Aqu hay un nullPointerException,porque S sigue siendo Null, y un valornull no puede indicar un tamao 44. Excepciones JVM StackOverFlowError: Es un error muy comncuando hay un mtodo recursivo, pero sobretodo se presenta cuando se acaba lamemoria RAM para el procesamiento, javano puede responde y sale esta excepcin.Esta recursividad se ejecutar tantasveces que va a ocupar toda la memoriaRAM al final saldr el errorStackOverFlowError 45. Excepciones deprogramacin NumberFormatException: Este errorsale cuando se trata de hacer uncasteo de formato y el valor no puedeconvertirse a nmero 46. Lista de errores yexcepcionesExcepcin Descripcin Lazado porArrayIndexOutOfBoundsException(Captulo 3:AsignacionesExcepcin que sale cuando se estatratando de entrar a una posicin de unarray que no existeJVMClassCastException(Chapter 2, Orientacina objetos")Excepcin que ocurre cuando se estatratando de castear un objeto que nocumple la regla Es unJVMIllegalArgumentException(Este captulo)Se arroja cuando un mtodo recibe unargumento formateado de una formadiferente a la que se esperaProgramacinIllegalStateException(Chapter 6, Formato")Lanzado cuando el estado del entorno noesta ptimo para la operacin que se tratade hacer, por ejemplo una clase Scannerque esta cerradaProgramacinNullPointerException(Chapter 3,"Assignments")Lanzado cuando se trata de acceder unobjeto cuyo valor es nuloJVM 47. Lista de errores yexcepcionesExcepcin Descripcin Lanzado porNumberFormatException(Chapter 3,"Assignments")Esta excepcin sale cuando el sistema recibeun String y va a pasarlo a nmero pero elvalor no es posible convertirloProgramacinAssertionError(This chapter)Se arroja cuando la evaluacin de la sentenciaarroja falseProgramacinExceptionInInitializerError(Chapter 3,"Assignments")Lanzado cuando se trata de inicializar unavariable esttica o un bloque de inicializacinJVMStackOverflowError(This chapter)Tpicamente lanzado cuando los recursos dela mquina estn copadosJVMNoClassDefFoundError(Chapter 10,"Development")Lanzada cuando java no encuentra una claseque necesita, causada por un error en la lneade comandos, la ruta del classpath o falta elarchivo .classJVM 48. TRABAJANDO CONMECANISMOS DEASERCIN2.3 Develop code that makes use of assertions, anddistinguish appropriate from inappropriate uses ofassertions. 49. AsercionesLas aserciones son mcanismos que usa java para poder hacervalidaciones en tiempo de desarrollo pero nunca en tiempo deejecucin, sin necesidad de usar debug, excepciones o colocar lneasde validacinPor ejemplo al usar una asercin con el fin de validar si un nmero esnegativo uno generalmente hace estoCon las aserciones este cdigo se ve reducido a esto:Adems otra ventaja que tiene es que si uno tiene la posibilidad dedeshabilitar las aserciones, por lo tanto se puede quitar la validacinsin necesidad de modificar el cdigo 50. Funcionamiento de lasaserciones La filosofa de las aserciones es muysimple, deben estar evaluando una expresin, encaso que la expresin sea verdadera pues nohay lio en la ejecucin, pero si es falsa entoncesarroja un AssertionError el cual no puede sercontrolado, por ser error. Existen dos formas de programarlasLa diferencia consiste en que en el segundo caso, el mensaje queest despus de los dos puntos sale en la traza del error cuandose arroja el AssertionError 51. Reglas de las aserciones Las aserciones deben evaluar un booleano,como un if y si imprime un valor debe ser unString como un System.out.printlnFormas vlidas de AssertErrores invlidas 52. La palabra assert y las versionesde java Resulta que las aserciones cambiandependiendo de la versin de java en laque se est compilando, de tal formaque si se usa una versin menor a 1.4 lapalabra assert puede servir para unaasercin o para identificar unavariable, ya de 1.4 en adelante es unapalabra reservada y no se podr usarpara identificar variablesjavac -source 1.3 OldCode.java Pjavac -source 1.4 NotQuiteSoOldCode.java O 53. La palabra assert y las versionesde java El siguiente cuadro muestra el comportamiento dependiendode la versin de java con la que se esta compilando 54. Habilitando aserciones Las aserciones por definicin estandeshabilitadas y si uno quiere que seejecuten entonces toca habilitarlasmanualmente. Para habiliarlo toca en la consolaescribir lo siguiente 55. Deshabilitando aserciones Las aserciones se pueden deshabiliarde nuevo una vez estn activas, esteproceso es igual de sencillo que lashabilitaciones, para esto en la consolase debe escribir algo as: 56. Activacin selectiva deaserciones Hay tres modalidades de habilitar lasaserciones: Sin argumentos: Poner java ea habilita lasaserciones en todas las clases de la aplicacin Con el nombre de un paquete: Poner algo comojava -ea:com.foo... Habilita el paquete foo. Con una clase: Se habilita o se desabilita conuna clase en especfico. Tambin existe la posibilidad de combinarestas tres opciones, por ejemplo: Aqu se puede ver que habilita todas clases(parte azul), menos la clase Foo (parte roja) 57. Activacin selectiva deaserciones 58. Uso apropiado de lasaserciones No es bueno validar parmetros deentrada No es bueno simplemente porque en unaaplicacin muy grande otras personaspueden estar usando un mtodo pblico,al habilitarle y colocarle aserciones puedeafectar la ejecucin de otro procesodistinto al de uno, es recomendablelanzar excepciones propias oIllegalArgumentException. 59. Uso apropiado de lasasersiones Validar si vienen valores en losparmetros de entrada del main. En el main puede venir con parmetros deentrada, al igual que el caso anterior esmejor no validarlo con aserciones si no mejorusar excepciones y control de variables. No usar aserciones para validar casosque en teora se supone que nuncasucederan Por lo general estos casos es mejorcontrolarlos con una variable o unaexcepcin pues si se llegaran a disparar laexcepcin no nos da suficiente informacinde que fue lo que ocurri 60. Uso apropiado de lasaserciones No usar aserciones que puedanocasionar efectos colaterales Es mejor no usar mtodos dentro de lasaserciones, pues recuerde que lasaserciones no siempre se ejecutan, solocuando estn habilitadas, por lo tanto estopuede generar inconvenientes para laejecucin del programadorLo ms seguro es queno siempre se ejecuteel mtodo modifyThingsy esto puede generarproblemas para la ejecucinde la aplicacin 61. PREGUNTAS DEPRCTICA 62. Pregunta 1Que es cierto: A. Only one compilation will succeed B. Exactly two compilations will succeed C. Exactly three compilations will succeed D. All four compilations will succeed E. No compiler warnings will be produced F. At least one compiler warning will be producedDado dos clases Y estas lneas de comando 63. Respuesta 1 Aqu hay que recordar que con java 3e inferior la palabra asert no esreservada y puede usarse comoidentificador de variable, con 4 enadelante es reservada y debe validaruna condicin. Por lo tanto Dejando la opcin B y F como vlidasPOOP 64. Pregunta 2Cul es el resultado? A. - B. -c C. -c2 D. -2c E. -c22b F. -2c2b G. -2c2bc H. Compilation fails 65. Respuesta 2 La respuestaes c, por latanto la opcincorrecta es B 66. Pregunta 3 Dada la siguiente lneatry { int x = Integer.parseInt("two"); }Cul es el catch ms apropiado? A. ClassCastException B. IllegalStateException C. NumberFormatException D. IllegalArgumentException E. ExceptionInInitializerError F. ArrayIndexOutOfBoundsException 67. Respuesta 3 ClassCastExcepction no es porque no se estancasteando clases sino primitivas, entonces no esla A. IllegalStateStatement: Tampoco es porque noestamos manejando variables estticas NumberFormatException: Si es, la conversin deformatos primitivos nmericos se debe validarcon esta excepcin, la respuesta correcta es laC. IlegalArgumentException: No es un mtodo, estaopcin se descarta ExceptionInInicializater Error: Tampoco es unerror de inicializacin. ArrayIndexOfBoundsException: No hay arrays niarreglos en el cdigo. 68. Pregunta 4Qu es cierto? A. It is appropriate to use assertions tovalidate arguments to methods marked public B. It is appropriate to catch and handleassertion errors C. It is NOT appropriate to use assertions tovalidate command-line arguments D. It is appropriate to use assertions togenerate alerts when you reach code thatshould not be reachable E. It is NOT appropriate for assertions tochange a programs state 69. Respuesta 4 A es incorrecta, recuerde que es unamala prctica validar variables deentrada con aserciones en un mtodopblico B es incorrecta, no es apropiadomanejar errores C es correcta, no es bueno validarargumentos de la lnea de entrada D es correcta, es la funcionalidad bsicade una asercin. E es correcta, no se debe usar unaasercin, si este genera un cambio en lalgica del la aplicacin. 70. Pregunta 5Cul opcin insertada en la lnea 4 funciona? A. for(int y : x) { B. for(x : int y) { C. int y = 0; for(y : x) { D. for(int y=0, z=0; z