SCJP –  Sección 2: Control de Flujo, Exceptions y Assertions José Miguel Selman G.  (jose.selman@gmail.com)‏
SCJP –  Objetivos exámen <ul><li>Develop code that implements an if or switch statement; and identify legal argument types...
Introducción <ul><li>El control de flujo es un aspecto fundamental de cualquier cualquier lenguaje de programación </li></...
if-else <ul><li>La expresión en paréntesis debe ser evaluada a un valor booleano:  true  o  false </li></ul><ul><li>La sen...
else if <ul><li>Pueden incluirse varias sentencias  else-if </li></ul>if (x >= 1 && x < 3) { // x es 1 o 2 } else if ( x >...
Expresiones válidas <ul><ul><li>int verdadero = 1; </li></ul></ul><ul><ul><li>int falso = 0; </li></ul></ul><ul><ul><li>if...
switch switch (expresión) { case constante1: // Código case constante2: // Código default: // Código } <ul><li>Por ejemplo...
<ul><li>Imprime 1, 2, default </li></ul><ul><li>Las expresiones son evaluadas de arriba a abajo y la primera coincidencia ...
Fall-Through y default int i = 11; switch(i) { case 1: System.out.println(“1”); default: System.out.println(“default”); ca...
switch <ul><li>Las sentencias switch pueden evaluarse con los siguientes tipos:  enum ,  byte ,  short ,  int  y  char </l...
while while(expresión booleana) { // hacer algo } <ul><li>La  expresión debe evaluarse a un valor booleano  </li></ul><ul>...
<ul><li>La iteración dentro del ciclo puede detenerse prematuramente si se encuentra alguna de las siguientes sentencias <...
do-while do { // Código } while (expresión booleana); <ul><li>Entra al menos una vez </li></ul>int x = 10; do {   System.o...
for <ul><li>A partir de Java 5 apareció un nueva estructura para el loop for.  </li></ul><ul><li>La estructura básica tien...
for‏ <ul><li>Para el for básico aplican las mismas características de término anticipado de ciclo </li></ul><ul><li>En los...
break y continue <ul><li>Son usados para detener la ejecución completa del loop ( break ) o solamente la iteración actual ...
Labels <ul><li>Son usados típicamente en loops en conjunto con las sentencias  break  o  continue .  </li></ul><ul><li>En ...
Exceptions <ul><li>Java provee un elegante mecanismo para detección y manipulación de errores: Las excepciones </li></ul><...
try { // Intentamos abrir un archivo para lectura } catch(NoTenemosLosPermisosSuficientes e) { // Mostrar mensaje de error...
Stack de Ejecución main() metodo1() main() metodo1() metodo2() main() main() metodo1() main() La ejecución se inicia con e...
Exception ducking <ul><li>En el caso que un método lance una excepción, esta es propagada al método que invocó al actual <...
<ul><li>También puede atraparse y ser re-lanzada con la sentencia  throw .  </li></ul>public  int cuentaLineasArchivo(Stri...
Tipos de Exceptions <ul><li>Las conocidas como Checked-Exceptions son las excepciones que las aplicaciones anticipan y dec...
Jerarquía de Excepciones java.lang.Object java.lang.Throwable java.lang.Error java.lang.Exception java.lang.RuntimeExcepti...
Atrapar excepciones <ul><li>Las sentencias catch deben estar ordenadas de arriba debajo de las Exceptions más particulares...
Excepciones y Errores comunes <ul><li>Pueden ser clasificadas en dos grandes categorías de acuerdo a quién las lanza </li>...
Algunas Comunes <ul><li>JVM </li></ul><ul><ul><li>NullPointerException : Al accesar un objeto a través de una variable con...
Algunas Comunes <ul><li>Programáticas </li></ul><ul><ul><li>NumberFormatException : Al intentar convertir un String a núme...
Assertions <ul><li>Disponibles en Java desde la versión 1.4 </li></ul><ul><li>Permiten probar las hipótesis durante el des...
Habilitación Assertions <ul><li>Por defecto deshabilitadas (Removidas por el class-loader por lo que no tienen efectos en ...
Usos correctos de Assertions <ul><li>No utilizar para validación de parámetros de métodos públicos  (usar java.lang.Illega...
Recursos <ul><li>http://java.boot.by/scjp-tiger/ch02.html </li></ul><ul><li>http://java.sun.com/docs/books/tutorial/essent...
Upcoming SlideShare
Loading in …5
×

Scjp Jug Section 2 Flow Control

1,814 views
1,739 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,814
On SlideShare
0
From Embeds
0
Number of Embeds
61
Actions
Shares
0
Downloads
46
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Scjp Jug Section 2 Flow Control

  1. 1. SCJP – Sección 2: Control de Flujo, Exceptions y Assertions José Miguel Selman G. (jose.selman@gmail.com)‏
  2. 2. SCJP – Objetivos exámen <ul><li>Develop code that implements an if or switch statement; and identify legal argument types for these statements. </li></ul><ul><li>Develop code that implements all forms of loops and iterators, including the use of for, the enhanced for loop (for-each), do, while, labels, break, and continue; and explain the values taken by loop counter variables during and after loop execution. </li></ul><ul><li>Develop code that makes use of assertions, and distinguish appropriate from inappropriate uses of assertions. </li></ul><ul><li>Develop code that makes use of exceptions and exception handling clauses (try, catch, finally), and declares methods and overriding methods that throw exceptions. </li></ul><ul><li>Recognize the effect of an exception arising at a specified point in a code fragment. Note that the exception may be a runtime exception, a checked exception, or an error. </li></ul><ul><li>Recognize situations that will result in any of the following being thrown: ArrayIndexOutOfBoundsException,ClassCastException, IllegalArgumentException, IllegalStateException, NullPointerException, NumberFormatException, AssertionError, ExceptionInInitializerError, StackOverflowError or NoClassDefFoundError. Understand which of these are thrown by the virtual machine and recognize situations in which others should be thrown programatically. </li></ul>* Extraído desde: http://www.sun.com/training/catalog/courses/CX-310-055.xml
  3. 3. Introducción <ul><li>El control de flujo es un aspecto fundamental de cualquier cualquier lenguaje de programación </li></ul><ul><li>En Java existen: </li></ul><ul><ul><li>Decisión (if, switch)‏ </li></ul></ul><ul><ul><li>Iteración (for, while, do, for-each )‏ </li></ul></ul><ul><ul><li>Excepciones </li></ul></ul><ul><ul><li>Depuración (assert)‏ </li></ul></ul>
  4. 4. if-else <ul><li>La expresión en paréntesis debe ser evaluada a un valor booleano: true o false </li></ul><ul><li>La sentencia else es opcional </li></ul><ul><li>Paréntesis opcionales </li></ul>if (expresión booleana) { // la expresión es verdadera, ==> dentro de la sentencia if } else { // la expresión es falsa, ==> dentro de la sentencia else } if (x > 3) System.out.println(“x es mayor a 3”); else System.out.println(“x es menos o igual a 3”);
  5. 5. else if <ul><li>Pueden incluirse varias sentencias else-if </li></ul>if (x >= 1 && x < 3) { // x es 1 o 2 } else if ( x >= 3 && x < 5 ) { // x es 3 o 4 } else if ( x >= 5 && x < 7 ) { // x es 5 o 6 } else { // x es mayor que 7 }
  6. 6. Expresiones válidas <ul><ul><li>int verdadero = 1; </li></ul></ul><ul><ul><li>int falso = 0; </li></ul></ul><ul><ul><li>if (verdadero) // ilegal </li></ul></ul><ul><ul><li>if (verdadero == true) // ilegal </li></ul></ul><ul><ul><li>if (verdadero == 1) // legal </li></ul></ul>Ojo con: <ul><ul><li>boolean b = false; </li></ul></ul><ul><ul><li>if (b = true) { </li></ul></ul><ul><ul><ul><li>// ... </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>if (false) </li></ul></ul><ul><ul><ul><li>System.out.println(“Hola”); </li></ul></ul></ul><ul><ul><ul><li>System.out.println(“Chao”); </li></ul></ul></ul><ul><ul><li>if (false) ; </li></ul></ul><ul><ul><ul><li>System.out.println(“Hola”); </li></ul></ul></ul>
  7. 7. switch switch (expresión) { case constante1: // Código case constante2: // Código default: // Código } <ul><li>Por ejemplo </li></ul>int largo = “abc”.length(); switch (largo) { case 1: System.out.println(“1”); break; case 2: System.out.println(“2”); break; default: System.out.println(“default”); }
  8. 8. <ul><li>Imprime 1, 2, default </li></ul><ul><li>Las expresiones son evaluadas de arriba a abajo y la primera coincidencia es el punto de entrada </li></ul>int largo = 1; switch (largo) { case 1: System.out.println(“1”); case 2: System.out.println(“2”); default: System.out.println(“default”); } int largo = 1; switch (largo) { case 1: case 2: System.out.println(“1 o 2”); break; default: System.out.println(“default”); }
  9. 9. Fall-Through y default int i = 11; switch(i) { case 1: System.out.println(“1”); default: System.out.println(“default”); case 2: System.out.println(“2”); case 3: System.out.println(“3”); } <ul><li>Imprime: default, 2, 3 </li></ul><ul><li>Las expresiones son evaluadas de arriba a abajo y la primera coincidencia es el punto de entrada </li></ul>
  10. 10. switch <ul><li>Las sentencias switch pueden evaluarse con los siguientes tipos: enum , byte , short , int y char </li></ul><ul><li>No pueden evaluarse con long </li></ul><ul><li>En las sentencias case deben usarse sólo literales o variables finales. (compile-time constants)‏ </li></ul>
  11. 11. while while(expresión booleana) { // hacer algo } <ul><li>La expresión debe evaluarse a un valor booleano </li></ul><ul><li>La expresión se prueba cada vez que se va a iterar por lo que se puede entrar al código 0 ó más veces. </li></ul>int x = 10; while(x > 10) { System.out.println(“dentro del loop”); } System.out.println(“fuera del loop”); <ul><li>Imprime solamente: fuera del loop. </li></ul>
  12. 12. <ul><li>La iteración dentro del ciclo puede detenerse prematuramente si se encuentra alguna de las siguientes sentencias </li></ul><ul><ul><li>break : la ejecución salta a la primera sentencia fuera del loop </li></ul></ul><ul><ul><li>return : se devuelve la ejecución al método que había realizado la llamada a este </li></ul></ul><ul><ul><li>System.exit() : Finaliza la ejecución del programa y la JVM se detiene </li></ul></ul><ul><li>Se puede usar la sentencia continue para volver al inicio del cuerpo del loop. </li></ul>
  13. 13. do-while do { // Código } while (expresión booleana); <ul><li>Entra al menos una vez </li></ul>int x = 10; do { System.out.println(“dentro del loop”); } while(x > 10); System.out.println(“fuera del loop”); <ul><li>Imprime: dentro del loop, fuera del loop. </li></ul><ul><li>Aplican las mismas características de término anticipado del ciclo que para while </li></ul>
  14. 14. for <ul><li>A partir de Java 5 apareció un nueva estructura para el loop for. </li></ul><ul><li>La estructura básica tiene tres partes principales </li></ul><ul><ul><li>Declaración e inicialización de variables </li></ul></ul><ul><ul><li>Una prueba condicional (expresión booleana) </li></ul></ul><ul><ul><li>Expresión de iteración </li></ul></ul><ul><li>Deben separase con punto-y-coma </li></ul>for ( Inicialización ; Condición ; Iteración ) { // instrucciones } <ul><li>Por ejemplo: </li></ul>for ( int i=0; i<10; i++) { } for (int i=10, j=3; y>3; y++) { } for (int x=0; x < 10 && y-- > 2 | x == 3; x++)
  15. 15. for‏ <ul><li>Para el for básico aplican las mismas características de término anticipado de ciclo </li></ul><ul><li>En los objetivos del examen la nueva estructura for se denomina for-each </li></ul><ul><ul><li>Fue creado como un atajo a los usos más frecuentes de for para iterar sobre arreglos </li></ul></ul>for (declaración: expresión) { // instrucciones } Por ejemplo: String[] numeros = {“uno”, “dos”, “tres”, “cuatro”, “cinco”}; for(String s: numeros) { System.out.println(s); }
  16. 16. break y continue <ul><li>Son usados para detener la ejecución completa del loop ( break ) o solamente la iteración actual ( continue ). </li></ul><ul><li>continue debe ser usado solamente dentro de un loop, en caso contrario provoca un error de compilación </li></ul><ul><li>break debe ser usado dentro de un loop o de un switch . </li></ul>for(int i=1; i<10; i++) { if ( i == 5 || i == 7 ) { continue; } System.out.println(i); } <ul><li>Imprime 1, 2, 3, 4, 6, 8, 9 </li></ul>
  17. 17. Labels <ul><li>Son usados típicamente en loops en conjunto con las sentencias break o continue . </li></ul><ul><li>En loops anidados se usan para indicar a cuál queremos aplicarle la sentencia. </li></ul><ul><li>Los labels se adhieren a las normas para los identificadores de nombres de variables. </li></ul><ul><li>Se debe poner el identificador del label seguido de dos-puntos (:) </li></ul>boolean condicion = true; externo: for(int i=0; i<10; i++) { while(condicion) { System.out.println(“Hola”); break externo; } System.out.println(“Esto no se imprimirá”); } System.out.println(“Chao”); <ul><li>Imprime “Hola” y “Chao” </li></ul>
  18. 18. Exceptions <ul><li>Java provee un elegante mecanismo para detección y manipulación de errores: Las excepciones </li></ul><ul><li>Permite a los desarrolladores detectar errores fácilmente sin tener que escribir código con reglas de códigos de retorno. </li></ul><ul><li>Una excepción es una condición-excepcional que altera el flujo de ejecución normal de un programa. </li></ul><ul><li>Cuando una de estas condiciones es alcanzada un excepción se dice ser lanzada (thrown). </li></ul><ul><li>Las palabras reservadas try , catch y finally se usan para estructurar el código. </li></ul><ul><ul><li>try es usado para identificar un bloque de código que puede ocasionar alguna condición de excepción </li></ul></ul><ul><ul><li>catch es usado para capturar las excepciones y manipularlas </li></ul></ul>
  19. 19. try { // Intentamos abrir un archivo para lectura } catch(NoTenemosLosPermisosSuficientes e) { // Mostrar mensaje de error al usuario } <ul><li>finally es usado para realizar “limpieza” de recursos ya que se ejecuta incluso si una excepción es lanzada. </li></ul><ul><li>Una sentencia try debe tener </li></ul><ul><ul><li>0 o más sentencias catch </li></ul></ul><ul><ul><li>A lo más un bloque finally </li></ul></ul><ul><li>Las excepciones pueden atraparse o bien declararse ( throws ) en cuyo caso no es necesario atraparlas con catch . Serán propagadas al método que esta abajo en el stack de ejecución. </li></ul><ul><ul><li>Para las excepciones que se declaran es importante conocer el stack de ejecución </li></ul></ul>
  20. 20. Stack de Ejecución main() metodo1() main() metodo1() metodo2() main() main() metodo1() main() La ejecución se inicia con el método main main llama a metodo1 metodo1 llama a metodo2 metodo2 retorna metodo1 retorno y main llama a metodo3 metodo3() main() metodo3 retorna
  21. 21. Exception ducking <ul><li>En el caso que un método lance una excepción, esta es propagada al método que invocó al actual </li></ul><ul><ul><li>Si este método también la lanza, entonces sigue hacia abajo del stack de ejecución. </li></ul></ul><ul><ul><li>Si no es atrapada cuando llega al método main, la máquina virtual finaliza su ejecución e imprime el error en stdout . </li></ul></ul>public int cuentaLineasArchivo(String filename) throws IOException { BufferedReader br; int lineas = 0; try { br = new BufferedReader(new FileReader(filename)); while (br.readLine() != null) { lineas++; } } finally { if (br != null) br.close(); } return lineas; }
  22. 22. <ul><li>También puede atraparse y ser re-lanzada con la sentencia throw . </li></ul>public int cuentaLineasArchivo(String filename) throws IOException { BufferedReader br; int lineas = 0; try { br = new BufferedReader(new FileReader(filename)); while (br.readLine() != null) { lineas++; } } catch(IOException ioe) { ioe.printStackTrace(); // o extraer el mensaje usando ioe.getMessage(); throw ioe; } finally { if (br != null) br.close(); } return lineas; }
  23. 23. Tipos de Exceptions <ul><li>Las conocidas como Checked-Exceptions son las excepciones que las aplicaciones anticipan y declaran dentro de la firma de sus métodos. </li></ul><ul><ul><li>public String leePrimeraLineaArchivo(String nombreArchivo) throws IOException; </li></ul></ul><ul><ul><li>Las Checked-Exceptions estan sujetas a ser atrapadas o declaradas. </li></ul></ul><ul><ul><li>Heredan de java.lang.Exception </li></ul></ul><ul><li>Los Errores son otro tipo de excepciones </li></ul><ul><ul><li>Heredan de java.lang.Error. </li></ul></ul><ul><ul><li>Corresponden a condiciones excepcionales que no pueden ser anticipadas y no hay manera de recuperarlas. </li></ul></ul><ul><ul><li>Por ejemplo cuándo la máquina virtual se queda sin memoria lanza un java.lang.OutOfMemoryError pero no hay mucho que podemos hacer para anticiparlo o recuperarnos, más que imprimir el stackTrace e intentar de notificar al usuario. </li></ul></ul><ul><li>El tercer tipo de excepciones son las java.lang.RuntimeException </li></ul><ul><ul><li>Son condiciones excepcionales internas de la aplicación, usualmente no anticipables e irrecuperables. Típicamente indícan bugs. Por ejemplo java.lang.NullPointerException. </li></ul></ul><ul><ul><li>No es necesario declararlas. </li></ul></ul>
  24. 24. Jerarquía de Excepciones java.lang.Object java.lang.Throwable java.lang.Error java.lang.Exception java.lang.RuntimeException Fuente: Sun Certified Programmer for Java 5 Study Guide, Kathy Sierra & Bert Bates, McGraw Hill … … …
  25. 25. Atrapar excepciones <ul><li>Las sentencias catch deben estar ordenadas de arriba debajo de las Exceptions más particulares y después las más generales, en caso contrario el código no compilará. </li></ul><ul><li>Solamente se ejecutará el bloque catch de la primera excepción que coincida y el flujo continuará en el bloque finally de existir. </li></ul>try { // ... } catch(NumerFormatException e) { // ... } catch(Exception e) { // ... } try { // ... } catch(Exception e) { // ... } catch(NumerFormatException e) { // ... } Correcto Incorrecto
  26. 26. Excepciones y Errores comunes <ul><li>Pueden ser clasificadas en dos grandes categorías de acuerdo a quién las lanza </li></ul><ul><ul><li>Excepciones de la JVM </li></ul></ul><ul><ul><li>Excepciones programáticas </li></ul></ul><ul><ul><li>private void miMetodo() { </li></ul></ul><ul><ul><li>miMetodo(); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>private void miMetodo(Usuario usuario) throws PermisosInsuficientesException { </li></ul></ul><ul><ul><li>if (!usuarioTienePrivilegios(usuario)) { </li></ul></ul><ul><ul><li>throw new PermisosInsuficientesException(); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>// ... </li></ul></ul><ul><ul><li>} </li></ul></ul>
  27. 27. Algunas Comunes <ul><li>JVM </li></ul><ul><ul><li>NullPointerException : Al accesar un objeto a través de una variable con valor null. </li></ul></ul><ul><ul><li>ArrayIndexOutOfBoundsException : Al accesar un indíce inválido de un arreglo </li></ul></ul><ul><ul><li>ClassCastException : Al intentar hacer un “cast” de un objeto a un tipo para el que no pasa la prueba de ES-UN (IS-A) </li></ul></ul><ul><ul><li>ExceptionInInitializerError : Cuando ocurre un error al inicializar una variable o bloque estático </li></ul></ul><ul><ul><li>StackOverflowError : Ocurre cuando un método recursa muy profundamente. </li></ul></ul><ul><ul><li>NoClassDefFoundError : Ocurre cuando no se encuentra una clase en tiempo de ejecución </li></ul></ul><ul><ul><li>OutOfMemoryError : Ocurre cuando el Heap se queda sin memoria para crear un objeto. </li></ul></ul><ul><ul><li>… </li></ul></ul>
  28. 28. Algunas Comunes <ul><li>Programáticas </li></ul><ul><ul><li>NumberFormatException : Al intentar convertir un String a número y el formato no era el esperado </li></ul></ul><ul><ul><li>IllegalArgumentException : Usado para indicar que los parámetros con los que se llamó a un método no eran los correctos </li></ul></ul><ul><ul><li>IllegalStateException : Usado para indicar que una operación no puede realizarse con las condiciones actuales (Por ejemplo intentar modificar el contenido de un buffer que se encuentra cerrado) </li></ul></ul><ul><ul><li>AsertionError : Lanzado cuando la prueba de la sentencia es evaluada a falso. </li></ul></ul><ul><ul><li>… </li></ul></ul>
  29. 29. Assertions <ul><li>Disponibles en Java desde la versión 1.4 </li></ul><ul><li>Permiten probar las hipótesis durante el desarrollo </li></ul><ul><li>Ignoradas por la JVM si no están habilitadas </li></ul><ul><ul><li>private void miMetodo(int n) { </li></ul></ul><ul><ul><ul><li>assert (n >= 0); // Si esto no es cierto se lanza un </li></ul></ul></ul><ul><ul><ul><li>// AssertionError </li></ul></ul></ul><ul><ul><ul><li>// ... resto del método ... </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>Dos tipos: </li></ul><ul><ul><li>assert (expresión); </li></ul></ul><ul><ul><li>assert (expresión): mensaje; </li></ul></ul><ul><li>La expresión debe ser un valor booleano, mientras que el mensaje debe ser cualquier cosa que resulte en valor. </li></ul>
  30. 30. Habilitación Assertions <ul><li>Por defecto deshabilitadas (Removidas por el class-loader por lo que no tienen efectos en la performance)‏ </li></ul><ul><li>Modificadores JVM </li></ul><ul><ul><li>-ea -enableassertions </li></ul></ul><ul><ul><li>-da -disableassertions </li></ul></ul><ul><ul><li>... se usa para paquete y sub-paquetes </li></ul></ul><ul><ul><li>java -ea </li></ul></ul><ul><ul><li>java -enableassertions </li></ul></ul><ul><ul><li>java -da </li></ul></ul><ul><ul><li>java -disableassertions </li></ul></ul><ul><ul><li>java -ea:cl.bee.util.RutValidador </li></ul></ul><ul><ul><li>java -ea -da:cl.bee.util.RutValidador </li></ul></ul><ul><ul><li>java -ea -da:cl.bee.util... </li></ul></ul>
  31. 31. Usos correctos de Assertions <ul><li>No utilizar para validación de parámetros de métodos públicos (usar java.lang.IllegalArgumentException) </li></ul><ul><li>No usar aserciones que modifiquen el valor de variables (pueden estar deshabilitadas)‏ </li></ul><ul><li>Usar para validación de parámetros en métodos privados </li></ul><ul><li>Usar para validar que un cierto código no debe ejecutarse (assert false;)‏ </li></ul>
  32. 32. Recursos <ul><li>http://java.boot.by/scjp-tiger/ch02.html </li></ul><ul><li>http://java.sun.com/docs/books/tutorial/essential/exceptions/ </li></ul><ul><li>http://java.sun.com/docs/books/tutorial/java/nutsandbolts/index.html </li></ul>

×