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 13-Jun-2015

558 views

Category:

Education


5 download

DESCRIPTION

SCJP,Oracle Certified Professional Java SE 6 Programmer 5

TRANSCRIPT

Page 1: Oracle Certified Professional  Java SE 6 Programmer-5

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 orecomendació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 hayasvisto antes como son las excepciones y assertions.

Las sentencias if y switch son tipos de controles condicionales o de decisión quepermite al programa comportarse de manera diferente dependiendo del resultadode una prueba lógica. Java también proporciona tres constructores de buclesdiferentes for, while y do, asi que puedes ejecutar un código una y otra vezdependiendo de que la condición sea cierta.

Las excepciones son una manera simple de organizar el código que se ocupe delos problemas que puedan producirse en tiempo de ejecución. Finalmente, el

Page 2: Oracle Certified Professional  Java SE 6 Programmer-5

mecanismo assertion, añadido al lenguaje en la versión 1.4, proporciona unaforma de hacer pruebas y controles de depuración sobre condiciones que sepueden esperar mientras desarrollamos.Con estas herramientas, puedes construir un programa robusto que puedamanejar cualquier lógica con destreza.Espera encontrarte en el examen una extensa gama de preguntas sobrecontrol e flujos, incluso en preguntas que no te están poniendo a prueba deconocimientos de control de flujos.

1. Objetivo de Certificación 2.1 - Sentencias if y switch2.1 Desarrollar código 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 decisión.Ejemplo de la sentencia if.

if-else El formato básico de una sentencia if es:

La expresión en paréntesis debe evaluarse como un booleano (true o false).Ejemplo el siguiente código nos muestra una sentencia if-else legal:

El bloque else es opcional, así que puedes usar también lo siguiente:

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

Page 3: Oracle Certified Professional  Java SE 6 Programmer-5

Oracle considera una buena práctica encerrar los bloques dentro de las llaves,incluso si solo hay una sentencia en el bloque. Tener cuidado con código como elanterior porque podrías 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 código es más confuso:

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

Existe otra forma de construir lo anterior con if, else if, else. El anterior código lopodríamos rescribir de la siguiente forma:

Page 4: Oracle Certified Professional  Java SE 6 Programmer-5

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

condición opcional else. Una vez que hay sucedido un else if, ningún else if o else se probara.

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

Producirá la siguiente salida:<4

Aunque el segundo else if es verdad, nunca se haceAlgunas veces puedes tener un problema como lo siguiente:

Intencionadamente se eliminó el sangrado de esta pieza de código para nodar pistas de a cual sentencia if pertenece el else.Para resolverlo es buscar el anterior if cerrado que no tenga else. En el casoanterior, el else pertenece a la segunda sentencia if. Con sangrado el código seriacomo veremos a continuación:

Si seguimos las convenciones de códigos, usaríamos llaves y todo sería más fácilde leer:

Page 5: Oracle Certified Professional  Java SE 6 Programmer-5

Presta mucha atención a la mala orientación como la siguiente:

El código anterior es exactamente el mismo que los anteriores dos ejemplos.

Sentencias legales de expresiones para if

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

El resultado es: truePuedes leer el código 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í quebásicamente, si doStuff es true, entonces obtendremos true. If doStuff() es false,entonces "x" tendría que ser mayor que 3 e "y" menor que 2 para que imprimatrue. El código anterior seria más complejo si quitamos los paréntesis ejemplo:

Page 6: Oracle Certified Professional  Java SE 6 Programmer-5

Ahora no imprime nada, el código anterior tiene un conjunto de paréntesis menosse evalúa 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 expresión. Debido a que eloperador "&&" evalúa la expresión como si estuviese entre paréntesis (y > 2) |doStruff(). En otras palabras, es evaluado como una única expresión antes de &&y después también.El siguiente código de ejemplo muestra una sentencia if que puede resultarengañoso, pero son ilegales, seguidas de ellas ponemos las legales.

switchSimular el uso de múltiples sentencias if es con una sentencia switch. En elsiguiente código if-else notaras como puede confundir tener anidadas if-else:

Page 7: Oracle Certified Professional  Java SE 6 Programmer-5

Ahora la misma funcionalidad representada con un switch:

NOTA: La razón 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 inclusión o exclusión provocacambios en la ejecución de switch.

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

Una expresión de switch debe evalúa a un char, byte, short, int, o enum. Estosignifica que si no usamos un enum, solo variables y valores que puedan serautomáticamente promocionados (en otras palabras, casting implícito) a unint son aceptables. Un constante case debe evaluarse con un mismo tipoque la expresión de switch utilize, con una gran limitación: la constante casedebe ser una constante en tiempo de compilación.

Desde que el argumento case ha de ser resuelta en tiempo de compilación, 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 decompilación. Por ejemplo:

Page 8: Oracle Certified Professional  Java SE 6 Programmer-5

La sentencia switch también puede hacer la comprobación de igualdad. Estosignifica que operadores relacionales como "mayor que" no pueden serusados en un case.Lo siguiente es un ejemplo de una expresión valida usando la invocación a unmétodo en una sentencia switch:

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

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

Page 9: Oracle Certified Professional  Java SE 6 Programmer-5

found : intrequired: bytecase 128:^Es ilegal tener varias etiquetas case con el mismo valor. El siguiente bloque decódigo 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 más importante a recordar sobre el flujo de ejecución a través de unasentencia switch, es este:Las constantes case son evaluadas de arriba abajo y la primera constante caseque coincida con la expresión del switch es el punto de entrada para ejecutarse.

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

La salida es: green blue done

Page 10: Oracle Certified Professional  Java SE 6 Programmer-5

Cuando el programa encuentra la palabra clave "break" durante la ejecuciónde una sentencia swicth, la ejecución inmediatamente se saldrá del bloquedel switch a la próxima línea después del swicth.Si break es omitido, el programa de ejecución mantiene el resto de bloques casehasta encontrarse con un break o el fin de la sentencia swicth. Examine elsiguiente código:

El código imprime lo siguiente:x is onex is twox is threeout of the switch

Esto sucede porque no se encuentra ninguna sentencia break, la ejecución siguióhacia abajo a través 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 código del case que coincidadebes poner break en cada case, como vemos a continuación:

Page 11: Oracle Certified Professional  Java SE 6 Programmer-5

Ejecutando el código anterior, al que le hemos añadido sentencias break, lo quepintara será:x is oneout of the switch

Un ejemplo de esta lógica "fall-throug" es mostrar el siguiente código:

La sentencia switch pintara "x is an even number" o nada, dependiendo de si elnúmero está entre 1 y 10, y si es par o impar. Por ejemplo, si x es 4 la ejecuciónentrara en el case 4 y seguirá cayendo através 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 añadas un comentario como fall through cuando uses la lógica "fall-through".

DefaultEl bloque de código que le pertenezca se ejecutara si ninguno de los case hacoincidido con la expresión del switch. Usando el código anterior, si queremosponer "x is an odd number" entonces usaríamos default, como podemos ver acontinuación:

Page 12: Oracle Certified Professional  Java SE 6 Programmer-5

2. Objetivo de Certificación 2.2 - Bucles e iteradores2.2 Desarrollar código 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 ydespués de la ejecución 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 código siempre y cuando la condición 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 lacondición sea true. A continuación veremos un ejemplo de while:

En todos los bucles, la expresión debe tener un resultado booleano. El cuerpo delwhile solo se ejecutara si la expresión tiene valor true. Una vez dentro del bucle, elcuerpo del bucle se repetirá hasta que la condición deje de cumplirse, ya queevalúa 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, asíque cuando es comprobado otra vez evaluara a false y saldrá del bucle.

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

En lugar de comprobar la variable, estarías declarándola e inicializándola, así quesiempre tendría el mismo valor.Si la expresión de comprobación es false, la primera vez que la expresión es

Page 13: Oracle Certified Professional  Java SE 6 Programmer-5

comprobada, el bloque de código se saltara y seguirá ejecutándose por la primeralínea después del bloque del while. Veamos el siguiente ejemplo:

Este código producirá la salida: past the loppPorque la expresión (x > 8) se evalúa a false y nada del código dentro del buclewhile se ejecutara nunca.

2.2. DoEl bucle do es similar a while, excepto que la expresión no es evaluada hasta queel código del bucle sea ejecutado. Por lo tanto el código es un bucle do estágarantizado que se ejecute al menos una vez. Ejemplo:

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

2.3. ForDespués de Java 5, el bucle for toma una segunda estructura. Al viejo estilo delbucle for lo llamaremos el "básico bucle for" y al nuevo estilo el "mejorado buclefor". El básico es más flexible que el mejorado, el mejorado fue diseñado parahacer iteraciones sobre arrays y colecciones más fáciles.

For básicoEl for se usa especialmente para controlar el flujo cuando ya sabes cuantasveces necesitas ejecutar la sentencia del bloque del bucle. La declaración deun bucle for tiene tres partes principales, además del cuerpo del bucle:

Declaración e inicialización de variables. La expresión booleana (la condición). La iteración.

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

Page 14: Oracle Certified Professional  Java SE 6 Programmer-5

Declaración e inicialización de variables.La primera parte de la sentencia for te permite declarar e inicializar cero, una omúltiples variables del mismo tipo dentro de los paréntesis y después de la palabraclave for. Si declaras más 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.

Expresión condicional (booleano)La expresión condicional debe evaluarse a un booleano. Puedes tener unasola expresión lógica, pero puede ser todo lo compleja que queramos. Ejemplo:

El código anterior es legal, pero el siguiente no:

El compilador te permitirá saber cuál 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 expresión". Enotras palabras, no puedes usar múltiples pruebas separadas por comas, aunquelas otras dos partes de una sentencia for puedan tener muchas partes.

Iteración

Page 15: Oracle Certified Professional  Java SE 6 Programmer-5

Después de cada ejecución del cuerpo del bucle for, la expresión deiteración es ejecutada. Recordar que SIEMPRE sucede después de la ejecucióndel cuerpo del bucle. Ejemplo:

El bucle anterior se ejecuta solo una vez. Tener en cuenta que salvo una salidaforzosa, la evaluación de la expresión de iteración y después la evaluacióncondicional son las últimas cosas que suceden en un bucle for.

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

Ejecutando este código obtenemos:in for loop

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

Bucle IssuesNinguna de las tres secciones de la declaración es requerida. El ejemplo es legal(aunque no es buena práctica).

Page 16: Oracle Certified Professional  Java SE 6 Programmer-5

En el ejemplo anterior, el bucle seria infinito. Para el examen, es importante saberque con la ausencia de la inicialización y la sección de incremento, el buclefunciona como un while. Ejemplo:

El siguiente ejemplo muestra un bucle for con múltiples 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 típicohacerlo. Pero incluso la expresión de iteración, la cual muchos erróneamentellamamos "expresión de incremento", no necesita incrementar o dar un valora algo, puedes poner virtualmente cualquier código arbitrario que tu quieresque suceda en cada iteración del bucle. Ejemplo:

El anterior código 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 básica sobre un array y después usaremos la versiónmejorada:

Page 17: Oracle Certified Professional  Java SE 6 Programmer-5

La salida es: 12341234

Formalmente vamos a describir el for mejorada como a continuación:for(declaration : expression)

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

compatible con los elementos del array al que estas accediendo. Expresión: Esto debe evaluar al array que desea a través del bucle. Podría ser

una variable array o un método 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 básico como al mejorado bucle for.

2.4. Break y ContinueLa sentencia break provoca que el programa pare la ejecución dentro del bucle yempiece procesando la primera línea de código después del bloque.La sentencia continue provoca que pare solo la iteración del bucle y la próximaiteración del mismo bucle empieze si la condición del bucle es cierta. Cuandousamos una sentencia continue con un bucle for, necesitas considerar los efectosque tiene continue en la iteración del bucle.

Page 18: Oracle Certified Professional  Java SE 6 Programmer-5

Ejemplo:

Cuando la sentencia continue es alcanzada, la expresión de iteración aún seejecutara. Así que en el ejemplo anterior yo incremento antes de comprobar lacondición (i < 10) otra vez. La mayor parte del tiempo, un continue es usadodentro de una comprobación if como a continuación:

Sentencias no etiquetadas

Etiquetas [labels] (concepto) En Java sólo se usan para identificar bucles y forzar sentencias “break” y

“continue”. En general, dan pie a código difícilmente 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 más internoen ejecución. Si queremos salir de otro bucle más externo, lo marcaremos conuna etiqueta X: y saldremos de él escribiendobreak X;

ES evidente que se podría programar con ayuda de algún método auxiliar y,probablemente, quedaría más claro.

Las sentencias anteriores break y continue puedes ser etiquetadas o noetiquetadas. Es más común 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 línea siguiente al bloque del bucle. Ejemplo:

Page 19: Oracle Certified Professional  Java SE 6 Programmer-5

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 leído 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 código podría parar de leer el ficherouna vez el error ocurra y pasar a la próxima línea después del bucle. Usarcontinue seria como decir, "Esta iteración en particular del bucle necesita parar,pero no el resto de iteraciones".

Sentencias etiquetadasMuchas sentencias en Java pueden ser etiquetadas, lo común es usar lasetiquetas con bucles como for o while, en conjunción 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 cuál de los bucles anidados quieres terminar o continuarcon la próxima iteración. 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 ydebería adherirse a la convención de nombres de Java. La sintaxis para usar elnombre de una etiqueta en conjunción 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:

Page 20: Oracle Certified Professional  Java SE 6 Programmer-5

La ejecución del código 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 próximalínea de código entonces pintara Good-Bye. Vamos a ver que sucede al sustituirbreak por continue:

La salida del código es:HelloHelloHelloHelloHelloGood-Bye

En este ejemplo Hello se imprime 5 veces. Después de ejecutar la sentenciacontinue, el flujo continua con la próxima iteración del bucle identificado con laetiqueta. Cuando la condición en el bucle "outer" es evaluada a false, el bucleacaba e imprime "Good-Bye".

Page 21: Oracle Certified Professional  Java SE 6 Programmer-5

Ejemplos:

3. Objetivo de Certificación 2.4 y 2.5 - Manejo de excepcionesEl manejo de excepciones permite a los desarrolladores detectar erroresfácilmente. El examen tiene tres objetivos que cubren el manejo deexcepciones.

3.1. Try y CatchEl término "excepción" significa "condición excepcional" y cuando ocurre altera elflujo normal de un programa. Un montón de cosas pueden dar lugar aexcepciones, incluyendo fallos de hardware, falta de recursos, y bugs. El códigoresponsable de hacer algo con la excepción es llamado "manejador de excepción"y captura las excepciones que se "lanzan".Try es usada para definir un bloque de código en el cual la excepción puedeocurrir. Este bloque de código es conocido como región vigilada. Una o másclausulas catch capturaran una excepción especifica para un bloque de códigoque la maneje.

3.2. FinallyUn bloque finally encierra el código que siempre ejecutaremos en el mismopunto después del bloque try, se haya o no se haya lanzado una excepción.Incluso si hay una sentencia "return" en el bloque try, el bloque finally se ejecutaradespués 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 código. Si el bloque try se ejecuta sinexcepciones, el bloque finally es ejecutado inmediatamente después del bloquetry. Si se ha lanzado una excepción, el bloque finally se ejecutara inmediatamentedespués del bloque catch. Usando un bloque finally permite al código la limpieza,incluso cuando no hay una clausula catch. El siguiente código legal demuestra untry con finally, pero no catch:

Page 22: Oracle Certified Professional  Java SE 6 Programmer-5

El siguiente código legal, muestra un try, catch y finally:

El siguiente código ILEGAL muestra try sin un catch o finally:

El siguiente código ILEGAL muestra un bloque catch mal colocado:

3.3. Propagando excepcionesLa mayoría de lenguajes tienen el concepto pila de método o pila de llamada. Enpocas palabras, la pila de llamada es la cadena de métodos que tu programaejecuta para obtener el método actual. Si tu programa empieza con el métodomain() 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

Page 23: Oracle Certified Professional  Java SE 6 Programmer-5

amain

Nosotros representaremos la pila como growing upward (aunque también puedeser vista como growing downward). Como puedes ver, el último método llamadoestá en la parte alta de la pila, mientras que el primero que se llamo esta abajo. Elmétodo más arriba de la pila podría ser el método que estas ejecutandoactualmente. Si nosotros bajamos por la pila, nos moveremos al método que llamoal actual. La siguiente figura nos muestra una manera de pensar sobre cómotrabaja la pila de llamada:

Si una excepción llega a la parte inferior de la pila de llamada y no ha sidocapturada causara que tu aplicación se pare.

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

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

Page 24: Oracle Certified Professional  Java SE 6 Programmer-5

ArrayIndexOutOfBoundsException . Como con cualquier otro objeto, puedesllamar a sus métodos.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 jerarquía 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 ejecucióndel programa, como la JVM ejecutando fuera de memoria. Generalmente.Generalmente, una aplicación no podrá recuperarse de un Error, así que norequiere que la manejen. Si tu código no lo maneja, compilara sin problemas.Aunque a menudo son considerados como condiciones excepcionales, los Erroresno son técnicamente excepciones porque no derivan de la clase Exception.Hay dos maneras de obtener información de una excepción. La primera es desdeel mismo tipo de la excepción. Es desde la información que podemos obtener delobjeto de la excepción. La clase Throwable ofrece algunos métodos que son útilesa la hora de manejar excepciones. Uno de estos es printStackTrace(), que nosmuestra una traza desde donde ocurrió la excepción.El printStackTrace pinta el método más reciente primero y continua hacia abajo,pintando el nombre de cada método 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){}.

Page 25: Oracle Certified Professional  Java SE 6 Programmer-5

Nosotros también 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 métodos 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();

Page 26: Oracle Certified Professional  Java SE 6 Programmer-5

Cuando se ejecute, y invoque al método dato, la pila de llamadas crecerá asíTest.main -->Leer.dato--->BufferdREader.readLine();

Si ocurre un error al ejecutarse readLine(),lanza una IOExcepcion, el sistemabuscaría en la pila de llamados hacia atrás, y comenzado por el propio método,uno que implemente un manejador de esta excepción, si no la encuentra elprograma se terminaría,en este caso el que terminaría atrapando la excepción seria el método 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 unaexcepción inesperada. Pero finally es útil para más que el manejo de excepciones— este permite al programador evitar tener que código de liberación se pase poralto accidentalmente por return, continue, o break. Poner código de liberación enun bloque finally es siempre una buena práctica, incluso cuando no se anticipanexcepciones.

3.6. Manejo de toda una jerarquía de clases de excepcionesSe puede capturar más de un tipo de excepción en la misma clausula catch. Si laclase excepción 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 excepción quesea subclase de clase especificada será capturada también.

Page 27: Oracle Certified Professional  Java SE 6 Programmer-5

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 excepción que actualmente tienes. En este caso escribirías una clausula catchcomo la siguiente:try {

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

e.printStackTrace ();}

Si cualquier código en el try lanza ArrayIndexOutOfBoundsException oStringIndexOutOfBoundsException, la excepción será capturada por el manejador.Esto puede ser conveniente, pero debería ser usado con moderación. Alespecificar una excepción de la superclase de captura en tu cláusula catch, estásperdiendo información importante sobre la excepción. Puedes encontrar fuera queexcepción exactamente tienes, pero si vas a hacer esto, sera mejor que escribiruna clausula catch para cada tipo de excepción de interés.

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

Page 28: Oracle Certified Professional  Java SE 6 Programmer-5

El programa intenta abrir un fichero y leer algún dato. Abriendo y leyendo ficherospueden generarse algunas excepciones, la mayoría son del tipo IOException.Imagina que en este programa estamos interesados en conocer si la excepciónexacta es FileNotFoundException. De lo contrario no sabríamos exactamente cuáles el problema.FileNotFoundException es una subclase de IOException. Por lo tanto, podríamosmanejarlo en la clausula que captura todos los subtipos de IOException, peroentonces tendríamos que testear la excepción para determinar si fue unFileNotFoundException. En cambio, codificamos un manejador para excepciónespecial (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 revés, el programa no compilaría.El manejador de alguna excepción más específica debe colocarse sobre otromanejador de una excepción más general. Lo siguiente no compilaría:

Page 29: Oracle Certified Professional  Java SE 6 Programmer-5

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

3.8. Declaración Excepción y la interfaz publica.La excepción que un método pueda lanzar debe ser declarada (al menos si sonsubclases de RuntimeException). La lista de excepciones que lanza es parte de lainterfaz pública del método. La palabra throws es usada para listar lasexcepciones que un método puede lanzar.

Este método no devuelve nada, no acepta argumentos y declara que puede lanzardos tipos de excepciones MyException1 y MyException2 (solo porque un métodolo declare no significa que siempre se lance, solo dice que tal vez).Si declaras la excepción que tu método puede que reciba de otro y noproporcionas un try/catch, entonces el método propagara al método que lo llamo yque se capture allí o continúe para ser manejado por un método más abajo de lapila.Cualquier método que pueda lanzar una excepción debe declararla (al menos si essubclase de RuntimeException). Esto incluye métodos que no la lancendirectamente pero deben ser atenuadas y dejar que la excepción siga hacia abajoen la pila. Si atenúas una excepción. Si atenúas la excepción, es como si túlanzases la excepción. 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 método debe manejar todas las excepcionescomprobadas mediante una clausula catch o listar cada excepción nocomprobada ni manejada como una excepción para lanzar.

Page 30: Oracle Certified Professional  Java SE 6 Programmer-5

Algunas excepciones son exentas de estas reglas. Un objeto de tipoRuntimeException podría ser lanzada desde cualquier método sin estarespecificado como parte de la interfaz publica del método (y no necesita estarpresente un manejador). Incluso si un método declara un RuntimeException, elmétodo llamante no está bajo ninguna obligación 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 método myMethod1(). Debido a que EOFException es subclase deIOExcpetion e IOException es subclase de Exception, es una excepciónchequeada y debe ser declarada como una excpeción que puede ser lanzada porel método. La interfaz publica del método myMethod2() llamada en myMethod1()declara que una excepción de este tipo puede ser lanzada. Sin embargo quemétodo lanze la excepción si myMethod1() o un método al que llame no nosimporta, simplemente debemos de saber que debemos capturar la excepción odeclararla para que pueda ser lanzada otra vez. En el ejemplo myMethod1() nocaptura la excepción decide lanzar el tambien. Otro ejemplo legal, myMethod3():

Este método puede lanzar un NullPointerException. Ya que RuntimeException esla superclase de NulPointerException, es una excepción no chequeada y nonecesita ser declarada. Podemos ver como myMethod3() no declara ningunaexcepción.

Las excepciones en tiempo de ejecución son excepciones no chequeadas. Elresto de excepciones son chequeadas y no derivan dejava.lang.RuntimeException. Una excepción chequeada debe ser capturada enalgún lugar del código. Si invocas a un método que lanza una excepciónchequeada pero no capturas la excepción, tu código no compilara. Por eso sellaman chequeadas, porque el compilador comprueba para estar seguro que secapturan o declaran. Puedes lanzar una excepción tu mismo y puede ser una de laAPI de Java o tuya propia como a continuación:

Page 31: Oracle Certified Professional  Java SE 6 Programmer-5

Si lanzas la excepción, 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 común 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 estás obligadoa capturar objetos Error o subtipos de Error. Tú mismo puedes lanzar un Error y túpuedes capturar uno, pero probablemente no quieras.Ejemplo:

Si lanzasemos una excepción chequeada en lugar de Error, entonces el métododoStuff() podríamos necesitarlo para declarar la excepción. Pero recuerda, ya queError no es un subtipo de Exception, no necesita ser declarado. Eres libre dedeclararlo, pero el compilador simplemente no prestara atención a una manera uotra o cuando o como el Error es lanzado, o por quien.

Page 32: Oracle Certified Professional  Java SE 6 Programmer-5

3.9. Relanzando la misma excepciónEs posible lanzar una nueva excepción desde la clausula catch, también puedeslanzar la misma excepción 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 excepción es lanzada después al método llamante(el próximo método por debajo de la pila de llamada). Si lanzas una excepciónchequeada desde una clausula catch, también debes declarar esa excepción. Enotras palabras, debes manejar Y declarar. El siguiente ejemplo es ilegal:

En el anterior código, el método doStuff() es capaz de lanzar una excepciónchequeada, 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 excepciónIOException que capturaste, Entonces debes declararla".

4. Objetivo de Certificación 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 intención de este objetivo es estar seguro de que estas familiarizado conalgunas de las más comunes excepciones y errores que te encontraras comoprogramador Java.

4.1. De donde vienen las excepciones.A los efectos de la preparación de exámenes vamos definir dos grandescategorías de excepciones y errores:

Page 33: Oracle Certified Professional  Java SE 6 Programmer-5

Excepciones JVM: Estas excepciones o errores que son exclusivas o mas,lógicamente, lanzadas por la JVM.

Excepciones programáticas: Estas excepciones son lanzadas explícitamentepor la aplicación y/o la API de los programadores.

4.2. JVM lanzando ExcepcionesVamos a empezar con una excepción muy común, el NullPointerException, estaexcepción 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 ejecución. Ejemplo:

El código compilara bien y la JVM lanzara un NullPointerException cuandointentes invocar al método length().Es posible que la pila crezca tanto que el SO ejecute fuera del espacio para la pila,cuando esto suceda tu obtendrás un StackOverFlowError. La manera más comúnpara que ocurra esto es la creación de un método recursivo. Observe el siguientemétodo recursivo:

Como puedes ver, si alguna vez cometemos el error de llamar al método 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 excepción.

4.3. Lanzando excepciones programaticamente.Por ejemplo, muchas clases en la API de Java tienen métodos que tomanargumentos String y convierte esos String a numéricos primitivos. Un buenejemplo de estas clases son las clases de envoltura como la clasejava.lang.Integer, que tiene métodos como parseInt() y valueOf(). A lo cual unString no puede convertirse a un numero, el método lanzaría unNumberFormatException. El código implementado parcialmente es algo como:

Page 34: Oracle Certified Professional  Java SE 6 Programmer-5

Otro ejemplo de exceciones programaticas incluye un AssetionError y lanzandoun IllegalArgumentException. NumberFormatException enxtiende deIllegalArgumentException, y es un poco más 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 excepciónmás precisa que podamos.

4.4. Resumen de las excepciones y errores.El objetivo 2.6 es listar 10 excepciones específicas y errores.Excepción (Capítulolocalización) Descripción Lanzado

ArrayIndexOutOfBoundsException

Es lanzada cuando seintenta acceder a unaarray con un indiceinvalido (negativo o mayorque el tamaño 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 unmétodo recibe unargumento con un formatodiferente al que espera elmétodo.

Programaticamente

IllegalStateException

Es lanzada cuando elestado del entorno noencuentra la operaciónque 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

Page 35: Oracle Certified Professional  Java SE 6 Programmer-5

cuyo valor actual es null.

NumberFormatException

Es lanzada cuando unmétodo que convierte unString a un número, nopuede hacer la conversióncon el String pasado.

Programaticamente

AssertionError (Este Capítulo)Es lanzada cuando unasentencia booleana deprueba devuelve false.

Programmatically

ExceptionInInitializerErrorEs lanzada cuando intentainicializar una variableestatica o un bloque deinicialización.

Por la JVM

StackOverflowError ( EsteCapítulo)

Normalmente lanzadacuando un método 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 Certificación 2.3 - Trabajando con Assertion2.3 Desarrollar código que haga uso de assertions y distinguir entre el usoapropiado e inapropiado de ellos.

Los assertions te permiten hacer pruebas a tus hipótesis 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 básico para trabajar con assertions,incluyendo como activarlos, como usarlos y como no usarlos.

5.1. AssertionsSupón que asumes que un número pasado a un método nunca será negativo.Mientras pruebas y depuras, quieres validar tu hipótesis, pero no quieres tirar desentencias print, manejadores de excepciones en tiempo de ejecución osentencias if/else cuando estés haciendo el desarrollo. Ejemplo:

Page 36: Oracle Certified Professional  Java SE 6 Programmer-5

Los Assertions te permiten probar tus hipótesis durante el desarrollo, pero elcódigo del assertion se evapora una vez este desplegado, depurando código paralocalizar y eliminar. Ejemplo rescribir el methodA() para validar que el argumentono sea negativo.

No solo usamos assertions para dejar el código más limpio y estricto, sino porquelos assertions están inactivos a menos que estén expresamente activos, el códigose ejecutará como si fuera escrito como este:

Si tu afirmación 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:

Page 37: Oracle Certified Professional  Java SE 6 Programmer-5

La diferencias es que la versión simple añade una segunda expresión, separadade la primera (expresión booleana) por dos puntos (:), esta expresión de valorString es añadida a la pila de traza. Ambas versiones lanzan un errorAssertionError inmediato, pero la versión simple te da un poco más de ayuda paradepurar mientras que la realmente simple te indica solo que la suposición fueincorrecta.

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

La segunda expresión, usada solo en la versión simple de una sentencia assert,puede ser cualquier cosa que se traduzca en un valor. Recordar, la segundaexpresión es usada para generar un String que se despliega en la pila de trazapara darte una pequeña información más para la depuración. 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 código muestra expresiones legales e ilegales para ambas partes deuna sentencia assert:

Page 38: Oracle Certified Professional  Java SE 6 Programmer-5

5.3. Activando assertionsSi quieres usar assertions, requiere versiones 1.4 o superiores para compilar conassertions en el código.

Identificador vs Palabra ClaveAntes de la versión 1,4, puede escribir el siguiente código como:

En el código anterior assert es un identificador. Que no es un problema antes de laversión 1.4, assert comienza a ser una palabra clave con la versión 1.4. Laconclusión es esta:Puedes usar assert como una palabra clave o como un identificador, pero no comoambas.

En el trabajoSi por alguna razón estas usando un compilador de Java 1.4 y usas assert comouna palabra clave, entonces debes activar de manera explícita la sensibilizaciónen tiempo de compilación de los assertions, como vemos a continuación: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 versión 1.4, donde assert es unapalabra clase".Usando la versión 5 de java y javacEs posible que aparezcan preguntas acerca de las versiones de código fuente,pero estas cuestiones serán siempre en el contexto de la compilación y puesta enmarcha de código 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 dándole una pieza de código antigua y que deberíacomportarse como un compilador viejo. Digamos que tienes que hacer unasolución rápida a una vieja pieza de 1.3 y esta pieza usa assert como unidentificador. Desde la línea de comandos puedes poner:javac -source 1.3 OldCode.javaEl compilador emitir warnings cuando se descubre la palabra assert usada comoun identificador, pero el código compilara y ejecutara.Supongamos que le dices al compilador que tu código es de la versión 1.4 oanterior, por ejemplo:

Page 39: Oracle Certified Professional  Java SE 6 Programmer-5

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 opción source o añadir una de las dosopciones de source:-source 1.5 o -source 5

Si quieres usar assert como identificador en tu código, debes compilar usando laopción -source 1.3. La siguiente tabla nos resume cómo reacciona el compiladorde Java 5 con assert:

Linea de comando assert Identificador=assert PalabraClave

javac -source 1.3 TestAsserts.java

El código compila conwarnings Fallo de compilación

javac -source 1.4 TestAsserts.java Fallo de compilación El código compila

javac -source 1.5 TestAsserts.java Fallo de compilación El código compila

javac -source 5 TestAsserts.java Fallo de compilación El código compila

javac TestAsserts .java Fallo de compilación El código compila

Ejecutando con AssertionUna vez que hayas escrito tu assertion en el código (en otras palabras, el códigousa assert como palabra clave, para realizar afirmaciones en tiempo de ejecución),puede optar por activar o desactivar sus afirmaciones en tiempo de ejecución. Losassertions están desactivados por defecto.

Activando assertions en tiempo de ejecución.Activas los assertions en tiempo de ejecución con:java -ea com.geeksanonymous.TestClassójava -enableassertions com.geeksanonymous.TestClass

Desactivando assertions en tiempo de ejecución.Desactivas los assertions en tiempo de ejecución con:java -da com.geeksanonymous.TestClassójava -disableassertions com.geeksanonymous.TestClass

Activación y DesactivaciónLa línea de comandos para los assertions puede ser usada de varias formas:

Page 40: Oracle Certified Professional  Java SE 6 Programmer-5

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 línea 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 línea 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 activación y desactivación deassertions:

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

java -da o java -disableassertions

Desactivar Assertions (característica 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 nodeberías capturar con una cláusula 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, debería ser deuna excepción. Para desalentarte de tratar de sustituir un assertion por unaexcepción, 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 método público

Page 41: Oracle Certified Professional  Java SE 6 Programmer-5

Lo siguiente es un uso inapropiado de assertions:

Un método público que podría llamarse desde código que no controlas (o decódigo que nunca has visto). Debido a que los métodos públicos son parte de tuinterfaz para el mundo exterior, supones que para garantizar todas las constraintssobre los argumentos serán aplicadas por el método en sí. Sin embargo, dado quelos assertions no están garantizados para ejecutarse en realidad (estándesactivados normalmente en una aplicación desplegada), la ejecución no va aocurrir si las afirmaciones no están habilitadas. Tú no quieres accederpúblicamente al código que funciona sólo condicionalmente, dependiendo de si lasafirmaciones están activados.Si necesitas validar argumentos de métodos públicos, probablemente usaras unaexcepción para lanzar un IllegalArgumentException si el valor pasado al métodoes inválido.

Usar assertions para validar argumentos de un método privadoSi escribes un método privado, casi seguro que escribiste (o controlaste) cualquiercódigo que lo llama. Cuando asumes que la lógica en el código para llamar almétodo 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 métodos privados, pero no imponer limitaciones a los métodos públicos.

No usar assertions para validar argumentos de la línea de comandosEsto es realmente un caso especial de "No usar assertions para validarargumentos de un método público". Si tu aplicación requiere argumentos en lalínea de comandos, probablemente usaras el mecanismo de excepción parareforzarlos.

Usar assertions, incluso en métodos públicos, para comprobar los casosque conoces que nunca supones que sucederán

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

Page 42: Oracle Certified Professional  Java SE 6 Programmer-5

Si suponemos que un bloque de código no se alcanzará, como en el ejemploanterior donde tu afirmación que x debe ser 1,2 o 3, entonces puedes usar assertfalse para causar que AssertionError sea lanzada si alguna vez se realiza estecódigo. Así que en el ejemplo switch, nosotros no estamos haciendo una pruebabooleana, nosotros tenemos que afirmar que nunca deberíamos estar allí, así quellegar a ese punto es un fracaso automático de nuestra afirmación o suposición.

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

La norma es, una expresión assert debería dejar el programa en el mismo estadoen que se encontraba antes de la expresión. Las expresiones assert no garantizanla ejecución siempre, por lo que no quieres que tu código se comporte de formadistinta dependiendo de si los assertions están 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:

Page 43: Oracle Certified Professional  Java SE 6 Programmer-5

Circulo

En este caso hemos añadido 2 assert que en caso de que el radio sea 0 nosmostrará un error. En el método main creamos un objeto de la clase círculo ypermitimos al usuario que asigne un valor para el radio.

Aserciones

Page 44: Oracle Certified Professional  Java SE 6 Programmer-5

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.

Page 45: Oracle Certified Professional  Java SE 6 Programmer-5

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.