oracle certified professional java se 6 programmer 5

45
México Distrito Federal a 08 de Marzo de 2014 Autor: Pablo Galeana Bailey Cualquier duda y/o comentario quedo a sus órdenes para alguna asesoría o recomendación para mejorar el presente material. Email: [email protected] Capítulo 5 Java tiene un par de características del control de flujo que puede que no hayas visto antes como son las excepciones y assertions. Las sentencias if y switch son tipos de controles condicionales o de decisión que permite al programa comportarse de manera diferente dependiendo del resultado de una prueba lógica. Java también proporciona tres constructores de bucles diferentes for, while y do, asi que puedes ejecutar un código una y otra vez dependiendo de que la condición sea cierta. Las excepciones son una manera simple de organizar el código que se ocupe de los problemas que puedan producirse en tiempo de ejecución. Finalmente, el

Upload: pablo-galeana-bailey

Post on 26-Nov-2015

70 views

Category:

Documents


1 download

TRANSCRIPT

  • Mxico Distrito Federal a 08 de Marzo de 2014

    Autor: Pablo Galeana Bailey

    Cualquier duda y/o comentario quedo a sus rdenes para alguna asesora orecomendacin para mejorar el presente material.

    Email: [email protected]

    Captulo 5

    Java tiene un par de caractersticas del control de flujo que puede que no hayasvisto antes como son las excepciones y assertions.

    Las sentencias if y switch son tipos de controles condicionales o de decisin quepermite al programa comportarse de manera diferente dependiendo del resultadode una prueba lgica. Java tambin proporciona tres constructores de buclesdiferentes for, while y do, asi que puedes ejecutar un cdigo una y otra vezdependiendo de que la condicin sea cierta.

    Las excepciones son una manera simple de organizar el cdigo que se ocupe delos problemas que puedan producirse en tiempo de ejecucin. Finalmente, el

  • mecanismo assertion, aadido al lenguaje en la versin 1.4, proporciona unaforma de hacer pruebas y controles de depuracin sobre condiciones que sepueden esperar mientras desarrollamos.Con estas herramientas, puedes construir un programa robusto que puedamanejar cualquier lgica con destreza.Espera encontrarte en el examen una extensa gama de preguntas sobrecontrol e flujos, incluso en preguntas que no te estn poniendo a prueba deconocimientos de control de flujos.

    1. Objetivo de Certificacin 2.1 - Sentencias if y switch2.1 Desarrollar cdigo que implemente una sentencia if o switch, e identificar tiposlegales de argumentos para estas sentencias.

    Las sentencias if y switch son sentencias que se refieren a sentencias de decisin.Ejemplo de la sentencia if.

    if-else El formato bsico de una sentencia if es:

    La expresin en parntesis debe evaluarse como un booleano (true o false).Ejemplo el siguiente cdigo nos muestra una sentencia if-else legal:

    El bloque else es opcional, as que puedes usar tambin lo siguiente:

    El cdigo anterior asignara 2 a "y" si la condicin de que "x" es mayor que tres escierta, pero las otras dos lneas se ejecutaran independientemente. Incluso lasllaves son opcionales si solo ejecutaras una sentencia dentro del cuerpo delbloque condicional. El cdigo del ejemplo anterior es legal (aunque norecomendado por legibilidad).

  • Oracle considera una buena prctica encerrar los bloques dentro de las llaves,incluso si solo hay una sentencia en el bloque. Tener cuidado con cdigo como elanterior porque podras pensar que queda redactado como.Si x es mayor que 3, entonces dale el valor 2 a "y", a z le sumas 8 y a "a" lasuma de "x" e "y".

    El siguiente cdigo es ms confuso:

    Es posible anidar sentencias if-else (aunque, otra vez no es recomendado porlegibilidad).Puedes crear una sentencia if-else para probar mltiples condiciones.Ejemplo:

    Existe otra forma de construir lo anterior con if, else if, else. El anterior cdigo lopodramos rescribir de la siguiente forma:

  • Hay un par de reglas para usar else y else if: Puedes tener 0 o 1 else para un if dado y debe ponerse depues de todos

    los else if. Puede tener de 0 a muchos else if para un if dado y debe ir antes de la

    condicin opcional else. Una vez que hay sucedido un else if, ningn else if o else se probara.

    El siguiente cdigo esta mal formado. Es probable encontrar este formato en elexamen. En cualquier caso, el cdigo demuestra el uso de multiples else ifs:

    Producir la siguiente salida:

  • Presta mucha atencin a la mala orientacin como la siguiente:

    El cdigo anterior es exactamente el mismo que los anteriores dos ejemplos.

    Sentencias legales de expresiones para if

    La expresin en una sentencia if debe ser una expresin booleana.Supongamos que doStuff() devuelve true,

    El resultado es: truePuedes leer el cdigo anterior como, "si "x" es mayor que 3 e "y" es menor que 2es true o el resultado de doStuff() es true, entonces pintamos true". As quebsicamente, si doStuff es true, entonces obtendremos true. If doStuff() es false,entonces "x" tendra que ser mayor que 3 e "y" menor que 2 para que imprimatrue. El cdigo anterior seria ms complejo si quitamos los parntesis ejemplo:

  • Ahora no imprime nada, el cdigo anterior tiene un conjunto de parntesis menosse evala como, " si "x" es mayor que 3 e "y" es menor que 5 o doStuff() escierto, entonces imprime true".Y si "x" no es mayor que 3 no continua evaluando la expresin. Debido a que eloperador "&&" evala la expresin como si estuviese entre parntesis (y > 2) |doStruff(). En otras palabras, es evaluado como una nica expresin antes de &&y despus tambin.El siguiente cdigo de ejemplo muestra una sentencia if que puede resultarengaoso, pero son ilegales, seguidas de ellas ponemos las legales.

    switchSimular el uso de mltiples sentencias if es con una sentencia switch. En elsiguiente cdigo if-else notaras como puede confundir tener anidadas if-else:

  • Ahora la misma funcionalidad representada con un switch:

    NOTA: La razn de que esta sentencia switch emule los ifs anidados listadosanteriormente es porque la sentencia break fue colocada dentro del switch. Engeneral, las sentencias break son opcionales, su inclusin o exclusin provocacambios en la ejecucin de switch.

    Espresiones legales switch-caseLa forma general de la sentencia switch es:

    Una expresin de switch debe evala a un char, byte, short, int, o enum. Estosignifica que si no usamos un enum, solo variables y valores que puedan serautomticamente promocionados (en otras palabras, casting implcito) a unint son aceptables. Un constante case debe evaluarse con un mismo tipoque la expresin de switch utilize, con una gran limitacin: la constante casedebe ser una constante en tiempo de compilacin.

    Desde que el argumento case ha de ser resuelta en tiempo de compilacin, estosignifica que solo puedes usar una constante o variable final que esta asignada aun valor literal. No vale con ser final debe ser una constante en tiempo decompilacin. Por ejemplo:

  • La sentencia switch tambin puede hacer la comprobacin de igualdad. Estosignifica que operadores relacionales como "mayor que" no pueden serusados en un case.Lo siguiente es un ejemplo de una expresin valida usando la invocacin a unmtodo en una sentencia switch:

    Que sucede si el switch tiene una variable menor que un entero, como en elsiguiente cdigo:

    Este cdigo no compilara. Aunque el argumento del switch es legal, un byte estaimplcitamente casteado a un entero) el segundo argumento case es demasiadolargo para un byte y el compilador lo sabe. El error que nos dara el cdigo ser:Test.java:6: possible loss of precision

  • found : intrequired: bytecase 128:^Es ilegal tener varias etiquetas case con el mismo valor. El siguiente bloque decdigo no compilara porque usas dos case con el mismo valor 80.

    Es legal para aprovechar el boxing hacer lo siguiente:

    Break y Fall-Through en bloques switchLa cosa ms importante a recordar sobre el flujo de ejecucin a travs de unasentencia switch, es este:Las constantes case son evaluadas de arriba abajo y la primera constante caseque coincida con la expresin del switch es el punto de entrada para ejecutarse.

    Una vez que una sentencia case es elegida, la JVM el bloque de cdigo quetiene asociado y TODAS las subsecuencias de bloques de cdigo ,salvo siencontramos un break. El siguiente ejemplo utiliza un enum en una sentenciacase.

    La salida es: green blue done

  • Cuando el programa encuentra la palabra clave "break" durante la ejecucinde una sentencia swicth, la ejecucin inmediatamente se saldr del bloquedel switch a la prxima lnea despus del swicth.Si break es omitido, el programa de ejecucin mantiene el resto de bloques casehasta encontrarse con un break o el fin de la sentencia swicth. Examine elsiguiente cdigo:

    El cdigo imprime lo siguiente:x is onex is twox is threeout of the switch

    Esto sucede porque no se encuentra ninguna sentencia break, la ejecucin siguihacia abajo a travs de cada case hasta el final. Esto es conocido como "fall-throug. Recordar, el case coincidente es simplemente el punto de entrada albloque switch. Para que solo se ejecute el bloque de cdigo del case que coincidadebes poner break en cada case, como vemos a continuacin:

  • Ejecutando el cdigo anterior, al que le hemos aadido sentencias break, lo quepintara ser:x is oneout of the switch

    Un ejemplo de esta lgica "fall-throug" es mostrar el siguiente cdigo:

    La sentencia switch pintara "x is an even number" o nada, dependiendo de si elnmero est entre 1 y 10, y si es par o impar. Por ejemplo, si x es 4 la ejecucinentrara en el case 4 y seguir cayendo atravs del resto de case 6, 8 y 10, dondepintara y se saldra. El break en el case 10 es innecesario ya que es el final delswitch y se saldra de todas formas.

    NOTA: Debido a que "fall-through" es menos intuitivo, Oracle recomiendaque aadas un comentario como fall through cuando uses la lgica "fall-through".

    DefaultEl bloque de cdigo que le pertenezca se ejecutara si ninguno de los case hacoincidido con la expresin del switch. Usando el cdigo anterior, si queremosponer "x is an odd number" entonces usaramos default, como podemos ver acontinuacin:

  • 2. Objetivo de Certificacin 2.2 - Bucles e iteradores2.2 Desarrollar cdigo que implemente bucles e iteradores, incluyendo el uso de"for", el aumento del bucle (for-each), "do", "while", "labels", "break" y "continue"; yexplicar los valores que toman las variables contadores del bucle durante ydespus de la ejecucin del bucle.

    Los bucles de Java son tres: while, do y for (en Java 5 hay dos tipos de for). Lostres permiten repetir un bloque de cdigo siempre y cuando la condicin sea true orepetirlo un numero especificado de iteraciones.

    2.1. WhileEl bucle "while" es bueno para situaciones en las que no sabes cuantas vecesvamos a repetir el bloque o la sentencia, pero quieres seguir iterando mientras lacondicin sea true. A continuacin veremos un ejemplo de while:

    En todos los bucles, la expresin debe tener un resultado booleano. El cuerpo delwhile solo se ejecutara si la expresin tiene valor true. Una vez dentro del bucle, elcuerpo del bucle se repetir hasta que la condicin deje de cumplirse, ya queevala a false. En el ejemplo anterior, el control del programa entra en el cuerpodel bucle porque x es igual a 2. Sin embargo, "x" es incrementado en el bucle, asque cuando es comprobado otra vez evaluara a false y saldr del bucle.

    Cualquier variable usada en la expresin de un bucle while debe serdeclarada antes de que la expresin sea evaluada. En otras palabras, nopuedes decir:

    En lugar de comprobar la variable, estaras declarndola e inicializndola, as quesiempre tendra el mismo valor.Si la expresin de comprobacin es false, la primera vez que la expresin es

  • comprobada, el bloque de cdigo se saltara y seguir ejecutndose por la primeralnea despus del bloque del while. Veamos el siguiente ejemplo:

    Este cdigo producir la salida: past the loppPorque la expresin (x > 8) se evala a false y nada del cdigo dentro del buclewhile se ejecutara nunca.

    2.2. DoEl bucle do es similar a while, excepto que la expresin no es evaluada hasta queel cdigo del bucle sea ejecutado. Por lo tanto el cdigo es un bucle do estgarantizado que se ejecute al menos una vez. Ejemplo:

    La sentencia System.out.println() pintara una vez, incluso aunque la expresin seaevaluada a false. Siempre usa del punto y coma al final de la expresin while.

    2.3. ForDespus de Java 5, el bucle for toma una segunda estructura. Al viejo estilo delbucle for lo llamaremos el "bsico bucle for" y al nuevo estilo el "mejorado buclefor". El bsico es ms flexible que el mejorado, el mejorado fue diseado parahacer iteraciones sobre arrays y colecciones ms fciles.

    For bsicoEl for se usa especialmente para controlar el flujo cuando ya sabes cuantasveces necesitas ejecutar la sentencia del bloque del bucle. La declaracin deun bucle for tiene tres partes principales, adems del cuerpo del bucle:

    Declaracin e inicializacin de variables. La expresin booleana (la condicin). La iteracin.

    Las tres partes van separadas por "punto y coma" (;). Ejemplos:

  • Declaracin e inicializacin de variables.La primera parte de la sentencia for te permite declarar e inicializar cero, una omltiples variables del mismo tipo dentro de los parntesis y despus de la palabraclave for. Si declaras ms de una variable del mismo tipo, entonces necesitassepararlas con comas como el siguiente:

    El mbito de las variables declaradas en el bucle for terminan con el bucle for.Ejemplo:

    Al compilar la salida es:for (int x = 1, - x < 2; x++) {System.out.println(x); Legal}System.out.println(x); Not Legal! x is now out of scopeand can't be accessed.

    Expresin condicional (booleano)La expresin condicional debe evaluarse a un booleano. Puedes tener unasola expresin lgica, pero puede ser todo lo compleja que queramos. Ejemplo:

    El cdigo anterior es legal, pero el siguiente no:

    El compilador te permitir saber cul fue el error:TestLong.java:20: ';' expectedfor (int x = 0; (x > 5), (y < 2); x++) { }^

    La regla para recordar es esta: "Tu solo puedes tener una expresin". Enotras palabras, no puedes usar mltiples pruebas separadas por comas, aunquelas otras dos partes de una sentencia for puedan tener muchas partes.

    Iteracin

  • Despus de cada ejecucin del cuerpo del bucle for, la expresin deiteracin es ejecutada. Recordar que SIEMPRE sucede despus de la ejecucindel cuerpo del bucle. Ejemplo:

    El bucle anterior se ejecuta solo una vez. Tener en cuenta que salvo una salidaforzosa, la evaluacin de la expresin de iteracin y despus la evaluacincondicional son las ltimas cosas que suceden en un bucle for.

    Los ejemplos de salidas forzosas incluyen un break. un return, unSystem.exit() o una excepcin, la cual causa un final abrupto del bucle, sinejecutar la iteracin.Ejemplo:

    Ejecutando este cdigo obtenemos:in for loop

    La sentencia solo pinta una vez, por causa de la ejecucin de un return no soloabandonas la iteracin del bucle si no todo el mtodo. La siguiente tabla muestralas causas y el resultado de terminaciones abruptas del bucle.Cdigo en el bucle Que sucedebreak Salta inmediatamente a la primera linea despues del bucle.return Salta inmediatamente a volver al mtodo llamador.System.exit() Todos los programas en ejecucin se paran, la VM se cae.

    Bucle IssuesNinguna de las tres secciones de la declaracin es requerida. El ejemplo es legal(aunque no es buena prctica).

  • En el ejemplo anterior, el bucle seria infinito. Para el examen, es importante saberque con la ausencia de la inicializacin y la seccin de incremento, el buclefunciona como un while. Ejemplo:

    El siguiente ejemplo muestra un bucle for con mltiples variables en juego. Uncoma separa a las variables y deben ser del mismo tipo. Recordar que la variabledeclarada en el for es local al bucle for y no puede ser usada fuera del mbito delbucle.

    Todas las partes de un bucle for son independientes entre s. Las tressecciones no tienen que operar con la misma variable, aunque es tpicohacerlo. Pero incluso la expresin de iteracin, la cual muchos errneamentellamamos "expresin de incremento", no necesita incrementar o dar un valora algo, puedes poner virtualmente cualquier cdigo arbitrario que tu quieresque suceda en cada iteracin del bucle. Ejemplo:

    El anterior cdigo imprime:iterateiterate

    El bucle mejoradoEl bucle for mejorado, nuevo en Java 5, facilita trabajar sobre un array o unacoleccion. En lugar de tener tres componentes, tiene dos.Ejemplo iterar de la manera bsica sobre un array y despus usaremos la versinmejorada:

  • La salida es: 12341234

    Formalmente vamos a describir el for mejorada como a continuacin:for(declaration : expression)

    Las dos piezas de la sentencia for son: Declaracin: la recientemente declarada variable de bloque, de un tipo

    compatible con los elementos del array al que estas accediendo. Expresin: Esto debe evaluar al array que desea a travs del bucle. Podra ser

    una variable array o un mtodo que devuelve un array. El array puede ser decualquier tipo: primitivos, objetos e incluso arrays de arrays.

    Ejemplos legales e ilegales:

    El bucle for mejorado asume que, salvo una pronta salida del bucle, siempre iterasobre todos los elementos del array. Lo siguiente (break y continue) es aplicabletanto al bsico como al mejorado bucle for.

    2.4. Break y ContinueLa sentencia break provoca que el programa pare la ejecucin dentro del bucle yempiece procesando la primera lnea de cdigo despus del bloque.La sentencia continue provoca que pare solo la iteracin del bucle y la prximaiteracin del mismo bucle empieze si la condicin del bucle es cierta. Cuandousamos una sentencia continue con un bucle for, necesitas considerar los efectosque tiene continue en la iteracin del bucle.

  • Ejemplo:

    Cuando la sentencia continue es alcanzada, la expresin de iteracin an seejecutara. As que en el ejemplo anterior yo incremento antes de comprobar lacondicin (i < 10) otra vez. La mayor parte del tiempo, un continue es usadodentro de una comprobacin if como a continuacin:

    Sentencias no etiquetadas

    Etiquetas [labels] (concepto) En Java slo se usan para identificar bucles y forzar sentencias break y

    continue. En general, dan pie a cdigo difcilmente inteligible, por lo queno se recomienda su uso salvo en ocasiones muy justificadas.

    Lo normal es que una sentencia break fuerce la salida del bucle ms internoen ejecucin. Si queremos salir de otro bucle ms externo, lo marcaremos conuna etiqueta X: y saldremos de l escribiendobreak X;

    ES evidente que se podra programar con ayuda de algn mtodo auxiliar y,probablemente, quedara ms claro.

    Las sentencias anteriores break y continue puedes ser etiquetadas o noetiquetadas. Es ms comn usar break y continue sin etiquetar, en examense esperara que sepas trabajar con sentencias break y continue etiquetadas.Como se dijo antes, una sentencia break (no etiquetada) saldr fuera delconstructor del bucle y procesara la lnea siguiente al bloque del bucle. Ejemplo:

  • En el ejemplo anterior, la sentencia break no est etiquetada. El siguiente ser unejemplo de un continue sin etiquetar:

    En este ejemplo, un fichero est siendo ledo campo a campo. Cuando un error esencontrado, el programa pasa al siguiente campo en el fichero y usa la sentenciacontinue para volver al bucle (si no es el fin del fichero) y se mantiene leyendovarios campos. Si se hubiese usado break, el cdigo podra parar de leer el ficherouna vez el error ocurra y pasar a la prxima lnea despus del bucle. Usarcontinue seria como decir, "Esta iteracin en particular del bucle necesita parar,pero no el resto de iteraciones".

    Sentencias etiquetadasMuchas sentencias en Java pueden ser etiquetadas, lo comn es usar lasetiquetas con bucles como for o while, en conjuncin con break y continue.Un sentencia etiquetada debe ser colocada justo antes de la sentencia queest siendo etiquetada y consiste de un identificador valido que termine en"dos puntos"(:).Las etiquetas son necesarias en situaciones donde tienes un bucle anidadoy necesitas indicar cul de los bucles anidados quieres terminar o continuarcon la prxima iteracin. Una sentencia break saldr fuera del bucle etiquetado,si el break esta combinado con la etiqueta.Un ejemplo:

    La etiqueta debe adherirse a las reglas para el nombre de una variable valida ydebera adherirse a la convencin de nombres de Java. La sintaxis para usar elnombre de una etiqueta en conjuncin con una sentencia break es la palabra clavebreak, continuada por el nombre de la etiqueta y un "punto y coma" (;). Un ejemplodel uso de sentencias break etiquetado:

  • La ejecucin del cdigo produce:HelloGood-Bye

    En este ejemplo la palabra Hello se imprime una vez. Entonces, la sentencia breaketiquetada ser ejecutada y el flujo saldr del bucle etiquetado "outer". La prximalnea de cdigo entonces pintara Good-Bye. Vamos a ver que sucede al sustituirbreak por continue:

    La salida del cdigo es:HelloHelloHelloHelloHelloGood-Bye

    En este ejemplo Hello se imprime 5 veces. Despus de ejecutar la sentenciacontinue, el flujo continua con la prxima iteracin del bucle identificado con laetiqueta. Cuando la condicin en el bucle "outer" es evaluada a false, el bucleacaba e imprime "Good-Bye".

  • Ejemplos:

    3. Objetivo de Certificacin 2.4 y 2.5 - Manejo de excepcionesEl manejo de excepciones permite a los desarrolladores detectar erroresfcilmente. El examen tiene tres objetivos que cubren el manejo deexcepciones.

    3.1. Try y CatchEl trmino "excepcin" significa "condicin excepcional" y cuando ocurre altera elflujo normal de un programa. Un montn de cosas pueden dar lugar aexcepciones, incluyendo fallos de hardware, falta de recursos, y bugs. El cdigoresponsable de hacer algo con la excepcin es llamado "manejador de excepcin"y captura las excepciones que se "lanzan".Try es usada para definir un bloque de cdigo en el cual la excepcin puedeocurrir. Este bloque de cdigo es conocido como regin vigilada. Una o msclausulas catch capturaran una excepcin especifica para un bloque de cdigoque la maneje.

    3.2. FinallyUn bloque finally encierra el cdigo que siempre ejecutaremos en el mismopunto despus del bloque try, se haya o no se haya lanzado una excepcin.Incluso si hay una sentencia "return" en el bloque try, el bloque finally se ejecutaradespus de que la sentencia return sea encontrada y antes de que se ejecute elreturn.Este es el lugar perfecto para cerrar ficheros, conexiones de red y realizarcualquier otra limpieza que necesite el cdigo. Si el bloque try se ejecuta sinexcepciones, el bloque finally es ejecutado inmediatamente despus del bloquetry. Si se ha lanzado una excepcin, el bloque finally se ejecutara inmediatamentedespus del bloque catch. Usando un bloque finally permite al cdigo la limpieza,incluso cuando no hay una clausula catch. El siguiente cdigo legal demuestra untry con finally, pero no catch:

  • El siguiente cdigo legal, muestra un try, catch y finally:

    El siguiente cdigo ILEGAL muestra try sin un catch o finally:

    El siguiente cdigo ILEGAL muestra un bloque catch mal colocado:

    3.3. Propagando excepcionesLa mayora de lenguajes tienen el concepto pila de mtodo o pila de llamada. Enpocas palabras, la pila de llamada es la cadena de mtodos que tu programaejecuta para obtener el mtodo actual. Si tu programa empieza con el mtodomain() y main() llama a "a()", el cual llama a "b()", el cual a su vez llama a "c()", lapila de llamada tiene lo siguiente:cb

  • amain

    Nosotros representaremos la pila como growing upward (aunque tambin puedeser vista como growing downward). Como puedes ver, el ltimo mtodo llamadoest en la parte alta de la pila, mientras que el primero que se llamo esta abajo. Elmtodo ms arriba de la pila podra ser el mtodo que estas ejecutandoactualmente. Si nosotros bajamos por la pila, nos moveremos al mtodo que llamoal actual. La siguiente figura nos muestra una manera de pensar sobre cmotrabaja la pila de llamada:

    Si una excepcin llega a la parte inferior de la pila de llamada y no ha sidocapturada causara que tu aplicacin se pare.

    3.4. Definiendo ExcepcionesCualquier excepcin es la instancia de una clase que tiene a la claseException en su jerarqua de herencia. En otras palabras, las excepciones sonsiempre alguna subclase de java.jang.Exception.Cuando una excepcin es lanzada, un objeto de un subtipo particular Exception esinstanciado y manejado por el manejador de excepcin como un argumento de laclausula catch. Ejemplo:

    En este ejemplo, "e" es una instancia de la clase

  • ArrayIndexOutOfBoundsException . Como con cualquier otro objeto, puedesllamar a sus mtodos.3.5. Jerarquia ExceptionTodas las clases que son excepciones son subtipos de la clase Exception. Estaclase deriva de la clase Throwable (que deriva de la clase Object). La siguientefigura muestra la jerarqua de las excepciones.

    Hay dos clases que derivan de Throwable: Exception y Error. Las clases quederivan de error representan situaciones inusuales que no son causadas porerrores del programa e indica cosas que no suceden normal durante la ejecucindel programa, como la JVM ejecutando fuera de memoria. Generalmente.Generalmente, una aplicacin no podr recuperarse de un Error, as que norequiere que la manejen. Si tu cdigo no lo maneja, compilara sin problemas.Aunque a menudo son considerados como condiciones excepcionales, los Erroresno son tcnicamente excepciones porque no derivan de la clase Exception.Hay dos maneras de obtener informacin de una excepcin. La primera es desdeel mismo tipo de la excepcin. Es desde la informacin que podemos obtener delobjeto de la excepcin. La clase Throwable ofrece algunos mtodos que son tilesa la hora de manejar excepciones. Uno de estos es printStackTrace(), que nosmuestra una traza desde donde ocurri la excepcin.El printStackTrace pinta el mtodo ms reciente primero y continua hacia abajo,pintando el nombre de cada mtodo que trabaja por debajo.

    Evidentemente este metodo que llamados lanza este tipo de excepcion por tantoen el catch se pone con su respectiva excepcion a capturar.catch(IOException e){}.

  • Nosotros tambin podemos crear nuestros propios metodos que puedan declararexcepciones, como lo hace readLine que se vera mas adelante.

    Otra forma que no usa declaramientos de excepciones en mtodos es ellanzamiento de excepciones:boolean error=false;//codigo puede modificar el valor boolean errorif(error) throw new IOExcepcion();

    Esta lina lanza una excepcion de la clase IOExcepcion, lo que implica ser unobjeto de esa clase.Este objeto contiene informacion de la excepcion, incluyendo su tipo, el estado delsistema cuando el error ocurre. Para mas info respecto a q informacion lanzan lasdiferentes expeciones esta la api de java, busquen en la documentacion.googleenlo.Quien o quienes son los responsables de capturar la excepcion??

    Cuando se lanza una excepcion, el sistema es responsable de encontrarle aalguien que la capture, para luego manipularla.Entonces esos alguien son los conjuntos de metodos involucrados q terminan porllamar a ese metodo q lanza una excepcion, pero ademas esos mismos estanespecificados en la pila de llamadas.

    Por ejemplo si yo hago estoString srt;Sout("dato"); es el print de java reducido.str=Leer.dato();

  • Cuando se ejecute, y invoque al mtodo dato, la pila de llamadas crecer asTest.main -->Leer.dato--->BufferdREader.readLine();

    Si ocurre un error al ejecutarse readLine(),lanza una IOExcepcion, el sistemabuscara en la pila de llamados hacia atrs, y comenzado por el propio mtodo,uno que implemente un manejador de esta excepcin, si no la encuentra elprograma se terminara,en este caso el que terminara atrapando la excepcin seria el mtodo dato().catch(IOExcepcion e){System.out.println("error: " + e.getMessage());}

    el getMessage() devuelve una cadena con informacion acerca de la excepcion.

    Vieron que siempre en el catch ponemos el tipo. Bueno a veces podemos tenermuchos bloque catch para diferentes excepciones, sin embargo es importante elorden con que se los coloca.Esto se debe que existen excepciones derivadas, implicando que por ejemplo sicolocamos como primer catch de clase Throwable, este acapararia todas lasexcepciones, ya que cualquiera referencia a una sublcase puede ser convertidaimplicitamente por java en una referencia a su superclase directa o indirecta....catch(EOFException e)...

    catch(IOException e)...maneja sus correspondientes excepto EOFException

    catch(Exception e)...este maneja esta clase de excepcion y todos su derivados,subclases.excepto EOFException e IOException.

    cuando usamos los bloque try y catch, en ocasiones se usa tambien el bloquefinally.

    Este bloque finally siempre se ejecuta cuando el bloque try sale(return,excepcion,etc). Esto asegura que el bloque finally se ejecuta incluso si ocurre unaexcepcin inesperada. Pero finally es til para ms que el manejo de excepciones este permite al programador evitar tener que cdigo de liberacin se pase poralto accidentalmente por return, continue, o break. Poner cdigo de liberacin enun bloque finally es siempre una buena prctica, incluso cuando no se anticipanexcepciones.

    3.6. Manejo de toda una jerarqua de clases de excepcionesSe puede capturar ms de un tipo de excepcin en la misma clausula catch. Si laclase excepcin que tu especificas en la clausula catch no tiene subclases,entonces solo la clase especificada ser capturada. Sin embargo, si la claseespecificada en la clausula catch tiene subclases, cualquier objeto excepcin quesea subclase de clase especificada ser capturada tambin.

  • Por ejemplo, la clase IndexOutOfBoundsException tiene dos subclases,ArrayIndexOutOfBoundsException y StringIndexOutOfBoundsException. Se puedeescribir un manejador de excepciones que se refiere a las excepciones producidaspor otro tipo de error de boundary, pero es posible que no pueda ser afectado conla excepcin que actualmente tienes. En este caso escribiras una clausula catchcomo la siguiente:try {

    // Some code here that can throw a boundary exception}catch (IndexOutofBoundsException e) {

    e.printStackTrace ();}

    Si cualquier cdigo en el try lanza ArrayIndexOutOfBoundsException oStringIndexOutOfBoundsException, la excepcin ser capturada por el manejador.Esto puede ser conveniente, pero debera ser usado con moderacin. Alespecificar una excepcin de la superclase de captura en tu clusula catch, estsperdiendo informacin importante sobre la excepcin. Puedes encontrar fuera queexcepcin exactamente tienes, pero si vas a hacer esto, sera mejor que escribiruna clausula catch para cada tipo de excepcin de inters.

    3.7. Excepciones concordantes (Exception Matching)Cuando una excepcin es lanzada, Java intenta encontrar (de arriba a abajo delcdigo) una clausula catch para el tipo de excepcin. Si no encuentra una clausulacatch que coincida, entonces la excepcin es propagada hacia abajo en la pila dellamada. Este proceso es llamado Excepciones concordantes (ExceptionMatching. Ejemplo:

  • El programa intenta abrir un fichero y leer algn dato. Abriendo y leyendo ficherospueden generarse algunas excepciones, la mayora son del tipo IOException.Imagina que en este programa estamos interesados en conocer si la excepcinexacta es FileNotFoundException. De lo contrario no sabramos exactamente cules el problema.FileNotFoundException es una subclase de IOException. Por lo tanto, podramosmanejarlo en la clausula que captura todos los subtipos de IOException, peroentonces tendramos que testear la excepcin para determinar si fue unFileNotFoundException. En cambio, codificamos un manejador para excepcinespecial (FileNotFoundException) y un diferente manejador para el resto desubtipos de IOExcpetion.Observa que la clausula catch de FileNotFoundException fue colocada sobre elmanejador de IOException. Si lo hacemos al revs, el programa no compilara.El manejador de alguna excepcin ms especfica debe colocarse sobre otromanejador de una excepcin ms general. Lo siguiente no compilara:

  • El error de compilacin es algo como esto:TestEx.java:15: exception java.io.FileNotFoundException hasalready been caught} catch (FileNotFoundException ex) {^Si una excepcin nos es subtipo o supertipo de otra, entonces el orden en el quese coloquen las clausulas catch no importa.

    3.8. Declaracin Excepcin y la interfaz publica.La excepcin que un mtodo pueda lanzar debe ser declarada (al menos si sonsubclases de RuntimeException). La lista de excepciones que lanza es parte de lainterfaz pblica del mtodo. La palabra throws es usada para listar lasexcepciones que un mtodo puede lanzar.

    Este mtodo no devuelve nada, no acepta argumentos y declara que puede lanzardos tipos de excepciones MyException1 y MyException2 (solo porque un mtodolo declare no significa que siempre se lance, solo dice que tal vez).Si declaras la excepcin que tu mtodo puede que reciba de otro y noproporcionas un try/catch, entonces el mtodo propagara al mtodo que lo llamo yque se capture all o contine para ser manejado por un mtodo ms abajo de lapila.Cualquier mtodo que pueda lanzar una excepcin debe declararla (al menos si essubclase de RuntimeException). Esto incluye mtodos que no la lancendirectamente pero deben ser atenuadas y dejar que la excepcin siga hacia abajoen la pila. Si atenas una excepcin. Si atenas la excepcin, es como si tlanzases la excepcin. Las subclases de RuntimeException son exentas, as queel compilador no comprobara para ver si tu las declaras. Pero todas las que no sonsubtipo de RuntimeException son comprobadas.Recordar esto: Cada mtodo debe manejar todas las excepcionescomprobadas mediante una clausula catch o listar cada excepcin nocomprobada ni manejada como una excepcin para lanzar.

  • Algunas excepciones son exentas de estas reglas. Un objeto de tipoRuntimeException podra ser lanzada desde cualquier mtodo sin estarespecificado como parte de la interfaz publica del mtodo (y no necesita estarpresente un manejador). Incluso si un mtodo declara un RuntimeException, elmtodo llamante no est bajo ninguna obligacin de manejar o declarar unRuntimeException, Error u cualquier otro subtipo de excepciones no chequeadas ylas excepciones no comprobadas no tienen que ser especificadas o manejadas.Ejemplo:

    Observemos el mtodo myMethod1(). Debido a que EOFException es subclase deIOExcpetion e IOException es subclase de Exception, es una excepcinchequeada y debe ser declarada como una excpecin que puede ser lanzada porel mtodo. La interfaz publica del mtodo myMethod2() llamada en myMethod1()declara que una excepcin de este tipo puede ser lanzada. Sin embargo quemtodo lanze la excepcin si myMethod1() o un mtodo al que llame no nosimporta, simplemente debemos de saber que debemos capturar la excepcin odeclararla para que pueda ser lanzada otra vez. En el ejemplo myMethod1() nocaptura la excepcin decide lanzar el tambien. Otro ejemplo legal, myMethod3():

    Este mtodo puede lanzar un NullPointerException. Ya que RuntimeException esla superclase de NulPointerException, es una excepcin no chequeada y nonecesita ser declarada. Podemos ver como myMethod3() no declara ningunaexcepcin.

    Las excepciones en tiempo de ejecucin son excepciones no chequeadas. Elresto de excepciones son chequeadas y no derivan dejava.lang.RuntimeException. Una excepcin chequeada debe ser capturada enalgn lugar del cdigo. Si invocas a un mtodo que lanza una excepcinchequeada pero no capturas la excepcin, tu cdigo no compilara. Por eso sellaman chequeadas, porque el compilador comprueba para estar seguro que secapturan o declaran. Puedes lanzar una excepcin tu mismo y puede ser una de laAPI de Java o tuya propia como a continuacin:

  • Si lanzas la excepcin, el compilador garantizara que la declares :

    El resultado es:TestEx.java:6: unreported exception MyException; must be caughtordeclared to be thrownthrow new MyException();^

    Los objetos de tipo Error no son objetos Exception, aunque representencondiciones excepcionales. Error y Exception tienen en comn la superclaseThrowable, por eso los dos pueden ser lanzados usando la palabra throw. Cuandoun Error o una subclase de Error es lanzada, no es chequeada. No ests obligadoa capturar objetos Error o subtipos de Error. T mismo puedes lanzar un Error y tpuedes capturar uno, pero probablemente no quieras.Ejemplo:

    Si lanzasemos una excepcin chequeada en lugar de Error, entonces el mtododoStuff() podramos necesitarlo para declarar la excepcin. Pero recuerda, ya queError no es un subtipo de Exception, no necesita ser declarado. Eres libre dedeclararlo, pero el compilador simplemente no prestara atencin a una manera uotra o cuando o como el Error es lanzado, o por quien.

  • 3.9. Relanzando la misma excepcinEs posible lanzar una nueva excepcin desde la clausula catch, tambin puedeslanzar la misma excepcin que capturaste. Aqu una clausula catch que hace eso:

    Todas las otras clausulas acosiadas con el mismo try son ignoradas, si existe unbloque finally, se ejecuta y la excepcin es lanzada despus al mtodo llamante(el prximo mtodo por debajo de la pila de llamada). Si lanzas una excepcinchequeada desde una clausula catch, tambin debes declarar esa excepcin. Enotras palabras, debes manejar Y declarar. El siguiente ejemplo es ilegal:

    En el anterior cdigo, el mtodo doStuff() es capaz de lanzar una excepcinchequeada, asi que el compilador dice: "Bien, that's just peachy that you have atry/catch in there, but it's not good enough. Si tu quieres relanzar la excepcinIOException que capturaste, Entonces debes declararla".

    4. Objetivo de Certificacin 2.6 - Excepciones y errores comunes.2.6 Reconocer las situaciones que provocaran que se lancen cualquiera de lassiguiente: ArrayIndexOutOfBoundsException, ClassCastException,IllegalArgumentException, IllegalStateException, NullPointerException,NumberFormatException, AssertionError, ExceptionInInitializerError,StackOverflowError, o NoClassDefFoundError. Entendiendo cuales son lanzadaspor la VM y reconocer otras en las cuales deben ser lanzadas de maneraprogramatica.La intencin de este objetivo es estar seguro de que estas familiarizado conalgunas de las ms comunes excepciones y errores que te encontraras comoprogramador Java.

    4.1. De donde vienen las excepciones.A los efectos de la preparacin de exmenes vamos definir dos grandescategoras de excepciones y errores:

  • Excepciones JVM: Estas excepciones o errores que son exclusivas o mas,lgicamente, lanzadas por la JVM.

    Excepciones programticas: Estas excepciones son lanzadas explcitamentepor la aplicacin y/o la API de los programadores.

    4.2. JVM lanzando ExcepcionesVamos a empezar con una excepcin muy comn, el NullPointerException, estaexcepcin ocurre cuando intentas acceder a un objeto usando una variable dereferencia cuyo valor actual es null. No hay manera de que el compilador puedasaber esto antes de la ejecucin. Ejemplo:

    El cdigo compilara bien y la JVM lanzara un NullPointerException cuandointentes invocar al mtodo length().Es posible que la pila crezca tanto que el SO ejecute fuera del espacio para la pila,cuando esto suceda tu obtendrs un StackOverFlowError. La manera ms comnpara que ocurra esto es la creacin de un mtodo recursivo. Observe el siguientemtodo recursivo:

    Como puedes ver, si alguna vez cometemos el error de llamar al mtodo go(), tuprograma caera en un agujero negro, go() invocando a go() y asi sucesivamentehasta consumir toda la memoria y obtener un StackOverFlowError. Solo la JVMsabe cuando ocurre y sera la ella la que lanze la excepcin.

    4.3. Lanzando excepciones programaticamente.Por ejemplo, muchas clases en la API de Java tienen mtodos que tomanargumentos String y convierte esos String a numricos primitivos. Un buenejemplo de estas clases son las clases de envoltura como la clasejava.lang.Integer, que tiene mtodos como parseInt() y valueOf(). A lo cual unString no puede convertirse a un numero, el mtodo lanzara unNumberFormatException. El cdigo implementado parcialmente es algo como:

  • Otro ejemplo de exceciones programaticas incluye un AssetionError y lanzandoun IllegalArgumentException. NumberFormatException enxtiende deIllegalArgumentException, y es un poco ms preciso, as que en este caso,usando Un NumberFormatException apoya la idea que hemos discutido antes:que cuando tiene una jerarquia de excpeciones, debemos utilizar la excepcinms precisa que podamos.

    4.4. Resumen de las excepciones y errores.El objetivo 2.6 es listar 10 excepciones especficas y errores.Excepcin (Captulolocalizacin) Descripcin Lanzado

    ArrayIndexOutOfBoundsException

    Es lanzada cuando seintenta acceder a unaarray con un indiceinvalido (negativo o mayorque el tamao del array)

    Por la JVM

    ClassCastExceptionEs lanzada cuando seintenta castear unavariable de referencia a untipo que falla el test IS-A

    Por la JVM

    IllegalArgumentException

    Es lanzada cuando unmtodo recibe unargumento con un formatodiferente al que espera elmtodo.

    Programaticamente

    IllegalStateException

    Es lanzada cuando elestado del entorno noencuentra la operacinque esta intentando, e.g.,using a Scanner that'sbeen closed.

    Programaticamente

    NullPointerException Es lanzada cuando intentaacceder a un objeto conuna variable de referencia

    Por la JVM

  • cuyo valor actual es null.

    NumberFormatException

    Es lanzada cuando unmtodo que convierte unString a un nmero, nopuede hacer la conversincon el String pasado.

    Programaticamente

    AssertionError (Este Captulo)Es lanzada cuando unasentencia booleana deprueba devuelve false.

    Programmatically

    ExceptionInInitializerErrorEs lanzada cuando intentainicializar una variableestatica o un bloque deinicializacin.

    Por la JVM

    StackOverflowError ( EsteCaptulo)

    Normalmente lanzadacuando un mtodo esrecursivo infinitas veces.

    Por la JVM

    NoClassDefFoundError

    Es lanzada cuando la JVMno puede encontrar unclase que necesita, acausa de un error en lalinea de comandos,classpath o un fichero.class perdido.

    Por la JVM

    5. Objetivo de Certificacin 2.3 - Trabajando con Assertion2.3 Desarrollar cdigo que haga uso de assertions y distinguir entre el usoapropiado e inapropiado de ellos.

    Los assertions te permiten hacer pruebas a tus hiptesis durante el desarrollo, sinnecesidad de escribir manejadores de excepciones para excepciones que asumesque nunca suceder una vez el programa haya acabado su desarrollo y estedesplegado correctamente.En el examen se espera que sepas lo bsico para trabajar con assertions,incluyendo como activarlos, como usarlos y como no usarlos.

    5.1. AssertionsSupn que asumes que un nmero pasado a un mtodo nunca ser negativo.Mientras pruebas y depuras, quieres validar tu hiptesis, pero no quieres tirar desentencias print, manejadores de excepciones en tiempo de ejecucin osentencias if/else cuando ests haciendo el desarrollo. Ejemplo:

  • Los Assertions te permiten probar tus hiptesis durante el desarrollo, pero elcdigo del assertion se evapora una vez este desplegado, depurando cdigo paralocalizar y eliminar. Ejemplo rescribir el methodA() para validar que el argumentono sea negativo.

    No solo usamos assertions para dejar el cdigo ms limpio y estricto, sino porquelos assertions estn inactivos a menos que estn expresamente activos, el cdigose ejecutar como si fuera escrito como este:

    Si tu afirmacin resulta ser incorrecta (false), entonces un AssertionError eslanzada que nunca se debe manejar. Los Assertions son de dos tipo: realmentesimple o simple, como los siguientes:

  • La diferencias es que la versin simple aade una segunda expresin, separadade la primera (expresin booleana) por dos puntos (:), esta expresin de valorString es aadida a la pila de traza. Ambas versiones lanzan un errorAssertionError inmediato, pero la versin simple te da un poco ms de ayuda paradepurar mientras que la realmente simple te indica solo que la suposicin fueincorrecta.

    5.2. Reglas de expresin AssertionLos assertions pueden tener una o dos expresiones, dependiendo de siestas usando la simple o realmente simple. La primera expresin debe darsiempre como resultado un valor booleano. Tiene las mismas reglas quepara usar expresiones en pruebas if y while.

    La segunda expresin, usada solo en la versin simple de una sentencia assert,puede ser cualquier cosa que se traduzca en un valor. Recordar, la segundaexpresin es usada para generar un String que se despliega en la pila de trazapara darte una pequea informacin ms para la depuracin. Funciona de manerasimilar a System.out.println() al que le puedes pasar un valor primitivo o un objeto,y convertirlo en un String. Debe resolverse como un valor.El siguiente cdigo muestra expresiones legales e ilegales para ambas partes deuna sentencia assert:

  • 5.3. Activando assertionsSi quieres usar assertions, requiere versiones 1.4 o superiores para compilar conassertions en el cdigo.

    Identificador vs Palabra ClaveAntes de la versin 1,4, puede escribir el siguiente cdigo como:

    En el cdigo anterior assert es un identificador. Que no es un problema antes de laversin 1.4, assert comienza a ser una palabra clave con la versin 1.4. Laconclusin es esta:Puedes usar assert como una palabra clave o como un identificador, pero no comoambas.

    En el trabajoSi por alguna razn estas usando un compilador de Java 1.4 y usas assert comouna palabra clave, entonces debes activar de manera explcita la sensibilizacinen tiempo de compilacin de los assertions, como vemos a continuacin:javac -source 1.4 com/geeksanonymous/TestClass.java

    En la linea anterior podemos leer, "compila la clase TestClass, que est en eldirectorio com/geeksanonymous y hazlo con la versin 1.4, donde assert es unapalabra clase".Usando la versin 5 de java y javacEs posible que aparezcan preguntas acerca de las versiones de cdigo fuente,pero estas cuestiones sern siempre en el contexto de la compilacin y puesta enmarcha de cdigo antiguo con las versiones actuales de javac y java.

    Compilando AssertionEl compilador de Java 5 usara assert como palabra clave por defecto. A menosque le digamos otra cosa, el compilador generara un mensaje de error siencuentra la palabra assert usada como un identificador. Sin embargo, puedesdecirle al compilador que estas dndole una pieza de cdigo antigua y que deberacomportarse como un compilador viejo. Digamos que tienes que hacer unasolucin rpida a una vieja pieza de 1.3 y esta pieza usa assert como unidentificador. Desde la lnea de comandos puedes poner:javac -source 1.3 OldCode.javaEl compilador emitir warnings cuando se descubre la palabra assert usada comoun identificador, pero el cdigo compilara y ejecutara.Supongamos que le dices al compilador que tu cdigo es de la versin 1.4 oanterior, por ejemplo:

  • javac -source 1.4 NotQuiteSoOldCode.java

    En este caso el compilador emitir un error cuando vea la palabra assert usadacomo un identificador. Si quieres decirle al compilador que use las reglas de Java5 tu puedes hacer tres cosas: omitir la opcin source o aadir una de las dosopciones de source:-source 1.5 o -source 5

    Si quieres usar assert como identificador en tu cdigo, debes compilar usando laopcin -source 1.3. La siguiente tabla nos resume cmo reacciona el compiladorde Java 5 con assert:

    Linea de comando assert Identificador=assert PalabraClave

    javac -source 1.3 TestAsserts.java

    El cdigo compila conwarnings Fallo de compilacin

    javac -source 1.4 TestAsserts.java Fallo de compilacin El cdigo compila

    javac -source 1.5 TestAsserts.java Fallo de compilacin El cdigo compila

    javac -source 5 TestAsserts.java Fallo de compilacin El cdigo compila

    javac TestAsserts .java Fallo de compilacin El cdigo compila

    Ejecutando con AssertionUna vez que hayas escrito tu assertion en el cdigo (en otras palabras, el cdigousa assert como palabra clave, para realizar afirmaciones en tiempo de ejecucin),puede optar por activar o desactivar sus afirmaciones en tiempo de ejecucin. Losassertions estn desactivados por defecto.

    Activando assertions en tiempo de ejecucin.Activas los assertions en tiempo de ejecucin con:java -ea com.geeksanonymous.TestClassjava -enableassertions com.geeksanonymous.TestClass

    Desactivando assertions en tiempo de ejecucin.Desactivas los assertions en tiempo de ejecucin con:java -da com.geeksanonymous.TestClassjava -disableassertions com.geeksanonymous.TestClass

    Activacin y DesactivacinLa lnea de comandos para los assertions puede ser usada de varias formas:

  • Sin argumentos (como en el ejemplo anterior): Acrivar o desactivar assertionsen todas las clases, excepto para las clases del sistema.

    Con el nombre de un paquete: Activa o desactiva los assertions en el paqueteespecificado y cualquier paquete que este en la misma jerarquia de directorios.

    Con el nombre de una clase: Activa o desactiva assertions en la claseespecificada.

    Puedes combinar las opciones para, decir, desactivar assertions en una solaclase, pero mantenlo activados para el resto de clases, como vemos:java -ea -da:com.geeksanonymous.Foo

    La lnea de comandos anterior le dice a la JVM que active los assertions demanera general, pero lo desactive para la clase com.geeksanonymous.Foo.Puedes hacer lo mismo pero con un paquete, como podemos ver:java -ea -da:com.geeksanonymous...

    La lnea de comandos anterior le dice a la JVM que active los assertions demanera general, pero lo desactive para el paquete com.geeksanonymous y todossus subpaquetes. La siguiente tabla resume la activacin y desactivacin deassertions:

    Linea de comando Significadojava -ea o java -enableassertions Activar Assertions.

    java -da o java -disableassertions

    Desactivar Assertions (caracterstica por defecto de Java5).

    java -ea:com.foo.Bar Activar Assertions en la clase com.foo.Bar.

    java -ea:com.foo... Activar Assertions en el paquete com.foo y cualquiera desus subpaquetes.

    java -ea -dsa Activar assertions en general, pero desactivar assertionsen las clases del sistema.

    java -ea -da:com.foo... Activar assertions en general, pero desactivar Assertionsen el paquete com.foo y cualquiera de sus subpaquetes..

    5.4. Usando assertions apropiadamentePor ejemplo, nunca debes manejar un assertion de fracaso. Eso significa que nodeberas capturar con una clusula catch y tratar de recuperar. Legalmente, sinembargo, AssertionError es una subclase de Throwable, por lo que puede sercapturada. Pero no lo hagas! Si vas a tratar de recuperarte de algo, debera ser deuna excepcin. Para desalentarte de tratar de sustituir un assertion por unaexcepcin, el AssertionError no proporciona acceso al objeto que lo gener. Todolo que obtiene es el mensaje String.As que quien decide si es apropiado es Oracle.No usar assertions para validar argumentos para un mtodo pblico

  • Lo siguiente es un uso inapropiado de assertions:

    Un mtodo pblico que podra llamarse desde cdigo que no controlas (o decdigo que nunca has visto). Debido a que los mtodos pblicos son parte de tuinterfaz para el mundo exterior, supones que para garantizar todas las constraintssobre los argumentos sern aplicadas por el mtodo en s. Sin embargo, dado quelos assertions no estn garantizados para ejecutarse en realidad (estndesactivados normalmente en una aplicacin desplegada), la ejecucin no va aocurrir si las afirmaciones no estn habilitadas. T no quieres accederpblicamente al cdigo que funciona slo condicionalmente, dependiendo de si lasafirmaciones estn activados.Si necesitas validar argumentos de mtodos pblicos, probablemente usaras unaexcepcin para lanzar un IllegalArgumentException si el valor pasado al mtodoes invlido.

    Usar assertions para validar argumentos de un mtodo privadoSi escribes un mtodo privado, casi seguro que escribiste (o controlaste) cualquiercdigo que lo llama. Cuando asumes que la lgica en el cdigo para llamar almtodo privado es correcta, puedes probar con un assertion de la siguientemanera:

    La nica diferencia entre los asuntos de los ejemplos anteriores es el modificadorde acceso. Por lo tanto, hacer cumplir las restricciones sobre los argumentos delos mtodos privados, pero no imponer limitaciones a los mtodos pblicos.

    No usar assertions para validar argumentos de la lnea de comandosEsto es realmente un caso especial de "No usar assertions para validarargumentos de un mtodo pblico". Si tu aplicacin requiere argumentos en lalnea de comandos, probablemente usaras el mecanismo de excepcin parareforzarlos.

    Usar assertions, incluso en mtodos pblicos, para comprobar los casosque conoces que nunca supones que sucedern

    Esto puede incluir bloques de cdigo que nunca deben llegar a un consenso,incluida la falta de una sentencia switch de la siguiente manera:

  • Si suponemos que un bloque de cdigo no se alcanzar, como en el ejemploanterior donde tu afirmacin que x debe ser 1,2 o 3, entonces puedes usar assertfalse para causar que AssertionError sea lanzada si alguna vez se realiza estecdigo. As que en el ejemplo switch, nosotros no estamos haciendo una pruebabooleana, nosotros tenemos que afirmar que nunca deberamos estar all, as quellegar a ese punto es un fracaso automtico de nuestra afirmacin o suposicin.

    No usar expresiones assert que puedan causar efectos secundariosEl siguiente cdigo seria una muy mala idea:

    La norma es, una expresin assert debera dejar el programa en el mismo estadoen que se encontraba antes de la expresin. Las expresiones assert no garantizanla ejecucin siempre, por lo que no quieres que tu cdigo se comporte de formadistinta dependiendo de si los assertions estn activados. Los assertions no debenprovocar efectos secundarios. Si tienes habilitadas las afirmaciones, el nicocambio en la forma en que su programa se ejecuta es que un AssertionError.Ejemplo aserciones:

  • Circulo

    En este caso hemos aadido 2 assert que en caso de que el radio sea 0 nosmostrar un error. En el mtodo main creamos un objeto de la clase crculo ypermitimos al usuario que asigne un valor para el radio.

    Aserciones

  • AssertTestjavac -source 1.4 AssertTest.javajavac AssertTest.javajavac -source 1.5 AssertTest.javajava -ea AssertTest

    AssertTest1OptionsA)The class compiles and runs, but does not print anything.B)The number 2 gets printed with AssertionErrorC)The number 3 gets printed with AssertionErrorD)compile error

    Correct answer is : BExplanations : When i and j are both 2, assert condition is false, and AssertionErrorgets generated.

  • AssertTest2OptionsA)The class compiles and runs, but does not print anything.B)The number 2 gets printed with AssertionErrorC)The number 3 gets printed with AssertionErrorD)compile error

    Correct answer is : AExplanations : When if condition returns true, the assert statement also returnstrue. Hence AssertionError not generated.