Java SCJP clase5

download Java SCJP clase5

of 59

Transcript of Java SCJP clase5

  • 8/18/2019 Java SCJP clase5

    1/59

    SCJP 6Clase 5 – Control de Flujo,

    Exceptions y Assertions

    Ezequiel Aranda

    Sun Microsystems Campus

    Ambassador

  • 8/18/2019 Java SCJP clase5

    2/59

    Disclaimer & Acknowledgments

    > Even though Ezequiel Aranda is a full-time employee of Sun

    Microsystems, the contents here are created as his own

    personal endeavor and thus does not reflect any official

    stance of Sun Microsystems.

    Sun Microsystems is not responsible for any inaccuracies inthe contents.

    Acknowledgments – The slides of this presentation are made

    from “SCJP Unit 5” by Warit Wanwithu and Thanisa

    Kruawaisayawan and SCJP Workshop by P. Srikanth.

    This slides are Licensed under a Creative Commons

    Attribution – Noncommercial – Share Alike 3.0

    > http://creativecommons.org/licenses/by-nc-sa/3.0/

  • 8/18/2019 Java SCJP clase5

    3/59

     AGENDA

    > if

    > for

    > for “mejorado”

    break y continue

    > excepciones

    > assertions

  • 8/18/2019 Java SCJP clase5

    4/59

    if

    > Observen este ejemplo:

    if (exam.done())

    if (exam.getScore() < 0.61)

    System.out.println("Try again.");

    // ¿A que “if” pertenece el próximo else?

    else

    System.out.println("Javamaster!");

    > El “else” pertenece al segundo “if”

  • 8/18/2019 Java SCJP clase5

    5/59

    if (II)

    int trueInt = 1;

    int falseInt = 0;

    if (trueInt) // ilegal

    if (trueInt == true) // ilegal

    if (1) // illegal

    if (falseInt == false) // ilegal

    if (trueInt == 1) // legal

    if (falseInt == 0) // legal

    La única expresión legal en un if es una de tipoboolean.

    > En algunos lenguajes, 0 == false y 1 == true. No es

    así en Java.

  • 8/18/2019 Java SCJP clase5

    6/59

    Switch

    > Una expresión en un switch debe evaluar a

    un char, byte, short, int o, a partir de Java 5,

    un enum.

    Una constante en un case debe evaluar almismo tipo que la expresión puede usar.

    > Switch solo chequea igualdad.

    Puede colocarse el caso por defecto arriba.

  • 8/18/2019 Java SCJP clase5

    7/59

    Switch (II)

    Una vez que se encuentra unacorrespondencia entre las constantes del

    case, la JVM ejecutará el bloque de código

    asociado, y TODOS los bloques subsecuentes

    (salvo que encuentre un break en el camino). public static void main(String [] args) {

    int x = 10; switch(x) {

    case 5: System.out.print("five ");

    case 10: System.out.print("ten ");

    case 15: System.out.print("fifteen");

    default: System.out.println("done");

    }} 

  • 8/18/2019 Java SCJP clase5

    8/59

    While

    > Cualquier variable a ser utilizada en la

    expresión del bucle while debe ser declarada

    antes de la evaluación de la expresión.

     while (int x = 2) { } // no legal

    > El punto clave a recordar del while es que

    podría no ejecutarse nunca.

  • 8/18/2019 Java SCJP clase5

    9/59

    Bucles

    > Ejemplos de salidas forzadas de los bucles

    son:

     break

    returnSystem.exit()

    exception

    Los cuales causan que un loop termineabruptamente, sin ejecutar la expresión de la

    iteración.

  • 8/18/2019 Java SCJP clase5

    10/59

    For

    Las variables declaradas en la sentencia “for”

    son locales al bucle, y no pueden ser usadas

    fuera del ámbito del bucle.

    int i = 0;for (;i

  • 8/18/2019 Java SCJP clase5

    11/59

    For (II)

    > El último detalle a destacar sobre el “for” es

    que las tres secciones del bucle son

    independientes entre si.

    int b = 3;for(int a=1; b=1;

    System.out.println("iterate")){

     b = b -a;

  • 8/18/2019 Java SCJP clase5

    12/59

    For “mejorado”

    El nuevo for incluido en Java 5 es una forma

    especializada del bucle que simplifica la tarea

    de recorrer arrays o collections.

    En vez de tener tres componentes, tiene solodos.

    int[] a = {1,2,3,4}; 

    for(int n : a) 

    System.out.print(n); 

  • 8/18/2019 Java SCJP clase5

    13/59

    For “mejorado” (II)

    > El viejo:

    int[] a = {1,2,3,4};

    for(int x = 0; x < a.length; x++)

    System.out.print(a[x]);

    > El nuevo:

    for(int n : a) 

    System.out.print(n); 

  • 8/18/2019 Java SCJP clase5

    14/59

    For “mejorado” (III)

    > Declaración: la variable declarada debe ser de

    un tipo compatible con los elementos del

    array. Su ámbito será el bloque del bucle, y su

    valor será el del elemento actual del array.> Expresión: la expresión debe evaluar al array

    que queremos recorrer. Puede ser una

    variable o un método que retorne un array. El

    array puede ser de cualquier tipo: primitivos,

    objetos, incluso arrays de arrays.

  • 8/18/2019 Java SCJP clase5

    15/59

    Ejemplos de for “mejorado”

    // Declaración de arraysint x;

    long x2;

    Long [] La = {4L, 5L, 6L};

    long [] la = {7L, 8L, 9L};int [][] twoDee = {{1,2,3}, {4,5,6}, {7,8,9}};

    String [] sNums = {"one", "two", "three"};

     Animal [] animals = {new Dog(), new Cat()}; 

  • 8/18/2019 Java SCJP clase5

    16/59

    Ejemplos de for “mejorado” (II)

    // declaraciones legales 

    for(long y : la ) ;

    for(long lp : La) ; // autounboxing

    for(int[] n : twoDee) ;

    for(int n2 : twoDee[2]) ; // 3er sub-array

    for(String s : sNums) ;

    for(Object o : sNums) ;

    for(Animal a : animals) ;

  • 8/18/2019 Java SCJP clase5

    17/59

    Ejemplos de for “mejorado” (III)

    // declaraciones ilegalesfor(x2 : la) ; // x2 ya está

    //declarado

    for(int x2 : twoDee) ; // no puedo

    //colocar un array en un int

    for(int x3 : la) ; // no puedo

    //poner un long en un int

    for(Dog d : animals) ; //no todos

    //eran perros

  • 8/18/2019 Java SCJP clase5

    18/59

    break y continue

    > Las palabras clave break y continue se usan,

    respectivamente, para detener un bucle

    completo o solo la iteración actual.

    La diferencia entre ellas es si continuamoscon una nueva iteración del loop o desde la

    sentencia que se encuentra directamente

    debajo del ciclo.

  • 8/18/2019 Java SCJP clase5

    19/59

    Continue

    for (int i = 0; i < 10; i++) {

    System.out.println("Inside loop");

    if (foo.doStuff() == 5) {

    continue;

    }

    // código que no

    //será alcanzado si

    //se ejecuta el//continue

    }

  • 8/18/2019 Java SCJP clase5

    20/59

    Break

     boolean problem = true;

     while (true) {

    if (problem) {

    System.out.println("There was a

     problem");

     break;

    }

    }

    // la ejecución continúa en este punto

  • 8/18/2019 Java SCJP clase5

    21/59

    Pregunta boolean problem = true;

    for (int i = 0; i < 5; i++) {

     while (true) {

    if (problem) {

    System.out.println("There was a

     problem"); break;

    System.out.println(“a”);

    }

    }}

    > ¿Cuál es el resultado de este código?

  • 8/18/2019 Java SCJP clase5

    22/59

    Etiquetas

    > Las sentencias break y continue pueden ser

    “etiquetadas” o “no etiquetadas”.

    > En el examen, se espera que conozcamos

    como funcionan las sentencias etiquetadas.> De colocarse, la etiqueta debe ir antes de la

    sentencia que queremos etiquetar, y consiste

    en un identificador valido, seguido de dos

    puntos (‘:’).

  • 8/18/2019 Java SCJP clase5

    23/59

    Break con etiquetas

     boolean isTrue = true;

    outer:

    for(int i=0; i

  • 8/18/2019 Java SCJP clase5

    24/59

    Continue con etiquetas

    outer:

    for (int i=0; i

  • 8/18/2019 Java SCJP clase5

    25/59

    Pregunta boolean problem = true;

    outer:

    for (int i = 0; i < 5; i++) {

     while (true) {

    if (problem) {

    System.out.println("There was a

     problem");

     break outer;

    System.out.println(“a”);

    }

    }

    > ¿Cuál es el resultado de este código? ¿Dónde

    continúa?

  • 8/18/2019 Java SCJP clase5

    26/59

    Manejo de Excepciones

    El “try” se usa para definir un bloque de

    código en el que pueden ocurrir excepciones.

    Este bloque de código se llama “región

    cautelosa” (lo cual significa que el “códigoriesgoso se coloca aquí”).

    Una o más clausulas “catch” emparejan cada

    excepción con el bloque de código que las

    maneja.

  • 8/18/2019 Java SCJP clase5

    27/59

    Manejo de Excepciones (II)

    try {

    // Código que podría arrojar una excepción

    }

    catch(MyFirstException) {

    // Código que trata la excepción “MyFirstException”

    }

    catch(MySecondException) {

    // Código que trata la excepción “MySecondException”

    }

    // Código que no arroja excepciones

  • 8/18/2019 Java SCJP clase5

    28/59

    Pregunta

    System.out.println(1/0.0);

    System.out.println(-1/0.0);

    System.out.println(Math.sqrt(-1));

    System.out.println(1/0);System.out.println(“Hello”);

    System.out.printf("%d+ %d", 123,

    456);

    ¿Qué imprime?

  • 8/18/2019 Java SCJP clase5

    29/59

    Manejo de excepciones (III)

    Nótese que siocurre una

    excepción, el resto

    de las líneas del

    bloque “try”

    nunca se

    ejecutarán.

    Una vez que el control pasa al bloque “catch”,nunca retorna al bloque try.

  • 8/18/2019 Java SCJP clase5

    30/59

    class Plane {

    static String s = "-";

     public static void main(String[] args){

    new Plane().s1();

    System.out.println(s); }

    void s1() {

    try { s2(); }

    catch (Exception e) {s += "c"; }}void s2() throws Exception {

    s3(); s += "2";

    s3(); s += "2b"; }

    void s3() throws Exception {throw new Exception();} }

    > ¿Cuál es el resultado de este código? 

  • 8/18/2019 Java SCJP clase5

    31/59

    finally

    Un bloque finally contiene código que

    siempre se ejecuta luego del bloque try, sin

    importar si hubo o no una excepción.

    Incluso si hay un return, el bloque finally seejecuta luego de que la JVM encuentra el

    return, pero antes de que este se ejecute.

  • 8/18/2019 Java SCJP clase5

    32/59

  • 8/18/2019 Java SCJP clase5

    33/59

    Orden de try, catch, finally

    try -catch== OK.

    > try-finally== OK.

    > try -catch-finally== OK.

    try-finally -catch!= OK.

    > Solo try!= OK.

    > Solo catch!= OK.

    Solo finally!= OK.

    try-algo–catch!= OK.

  • 8/18/2019 Java SCJP clase5

    34/59

    Propagando excepciones no

    atrapadas>

     

    Si nuestro programa comienza en un método

    main(), y main() llama a un método a(), que llama a

    un método b(), que a su vez llama a un método c(),

    la pila de llamadas consistirá de:

    c

    b

    a

    main

    Las excepciones son como pelotasque se arrojan de persona a

    persona, empezando desde la

    azotea.

  • 8/18/2019 Java SCJP clase5

    35/59

    Definiendo excepciones

    Cada excepción es una instancia de una clase

    que posee la clase Exception en su jerarquía.

    > Cuando una excepción es arrojada, se crea un

    objeto de un subtipo de Exception, que sepasa como parámetro a la clausula catch del

    manejador de dicha excepción.

  • 8/18/2019 Java SCJP clase5

    36/59

    Jerarquía de excepciones

    Generalmente, nuestra

    aplicación no podrá

    recuperarse de un Error.

    Las excepciones representanen general, ausencia de

    recursos.

    Las RuntimeExceptions

    suelen indicar errores en el

    programa.

  • 8/18/2019 Java SCJP clase5

    37/59

     Atrapar distintas excepciones

    Podemos atrapar más de una excepción en

    una única cláusula catch.

    > Por ejemplo: FileNotFoundException es una

    subclase de IOException. Por lo tanto,podemos atraparla tanto en una cláusula que

    atrape todos los subtipos de IOException,

    como creando una cláusula especifica para

    FileNotFoundException.

  • 8/18/2019 Java SCJP clase5

    38/59

     public static void main(String args[]) {

    try {

    RandomAccessFile raf= new

    RandomAccessFile("myfile.txt", "r");

     byte b[] = new byte[1000];

    raf.readFully(b, 0, 1000);

    }

    catch(FileNotFoundException e) {

    System.err.println("File not found");

    System.err.println(e.getMessage());

    e.printStackTrace();

    }

    catch(IOException e) {

    System.err.println("IO Error");

    System.err.println(e.toString());

    e.printStackTrace();

    }

  • 8/18/2019 Java SCJP clase5

    39/59

     Atrapar distintas excepciones (II)

    Es importante notar que la cláusula catch

    para la excepción “FileNotFoundException”,

    se encontraba arriba de la cláusula para la

    excepción “IOException”.> Si estuviesen al revés, sucedería algo como:

    java.io.FileNotFoundException has

    already been caught }

    catch (FileNotFoundException ex) { 

  • 8/18/2019 Java SCJP clase5

    40/59

    Métodos para manejar

    excepciones>

     

    try/ catch

    > throws

    Cada método debe tratar lasexcepciones (checked) proveyendo

    una clausula catch o bien declarar

    que es posible que arroje unaexcepción.

  • 8/18/2019 Java SCJP clase5

    41/59

    Declaración de excepciones

    Supongamos que nuestro método no arroja

    una excepción directamente, pero llama a un

    método que sí lo hace. Podemos elegir no

    tratar la excepción en nuestro método.> Para esto, declaramos la excepción que

    podría surgir, pero no proveemos cláusulas

    try/catch.

    void myFunction() throws

     MyException{

    // código del método } 

  • 8/18/2019 Java SCJP clase5

    42/59

    Pregunta

    void doStuff() {

    doMore();

    }

    void doMore() throws IOException{throw new IOException();

    }

    > ¿Compila? ¿Hay algo mal? 

  • 8/18/2019 Java SCJP clase5

    43/59

    RuntimeException

     public void myMethod3() {

    //código que podría arrojar una

     NullPointerException

    }>

     

    Las excepciones que heredan de

    RuntimeException se llaman “unchecked

    exceptions” y, como su nombre indica, no es

    necesario tratarlas o declararlas.

  • 8/18/2019 Java SCJP clase5

    44/59

     Algo más sobre excepciones

     public void test1() throws A{

    throw new B();

    } // Puede ser del mismo tipo que A o menor 

    class Parent {

     public void test2() throws Exception{}

    }

    class Child extends Parent {

     public void test2() throws

     ArithmeticException{}

    } // Debe ser del mismo tipo o menor 

  • 8/18/2019 Java SCJP clase5

    45/59

    Errores

    Heredan de Throwable

    (pueden arrojarse usando

    “throws”), pero son

    unchecked.> Podríamos atraparlos, pero en general es

    demasiado tarde.

    Por ejemplo, si tuviésemos un“OutOfMemoryError” o un

    “VirtualMachineError”, ¿Qué podríamos

    hacer?

  • 8/18/2019 Java SCJP clase5

    46/59

     Assertions

    Mientras probamos nuestro programa,

    validamos nuestras asunciones utilizando

    prints, sentencias if/else, manejadores de

    excepciones, etc.> ¡Y después hay que sacarlos!

    > Utilizando assertions, podremos validar

    nuestro programa sin quitar nada luego.

  • 8/18/2019 Java SCJP clase5

    47/59

     Assertions (II)

    Los assertions funcionan de forma sencilla.

    Siempre asumimos que son true. Si lo son,

    no hay problema, el programa continúa su

    ejecución. Si son false, ocurre unAssertionError. private void methodA(int num) {

    assert (num>=0);

    useNum(num+ x);} 

  • 8/18/2019 Java SCJP clase5

    48/59

  • 8/18/2019 Java SCJP clase5

    49/59

    void noReturn() { }

    int aReturn() { return 1; }

    void go() {

    int x = 1;

     boolean b = true;

    // Asserts legales: assert(x== 1);

    assert(b);

    assert true;assert(x== 1) : x;

    assert(x== 1) : aReturn();

    assert(x== 1) : new ValidAssert(); }

     Assertions (IV)

  • 8/18/2019 Java SCJP clase5

    50/59

     Assertions (V)

    // Asserts ilegales 

    // no son booleans assert(x = 1);

    assert(x);assert 0;

    assert(x== 1) : ;

    // no retornan un valor 

    assert(x== 1) : noReturn() -void;assert(x== 1) : ValidAssert va;

  • 8/18/2019 Java SCJP clase5

    51/59

    Habilitando Assertions

    Los assertions pueden habilitarse o

    desabilitarse a elección. Por defecto, están

    deshabilitados.

    Para ejecutar un programa con assertionshabilitados:

    java -ea TestClass

    > java -enableassertions TestClass 

  • 8/18/2019 Java SCJP clase5

    52/59

    Deshabilitar assertions

    Para deshabilitar los assertions:

    > java -daTestClass

    java -disableassertions TestClass 

    > Este comando puede parecer innecesario….

  • 8/18/2019 Java SCJP clase5

    53/59

    Habilitación selectiva

    Podemos combinar los comandos para, porejemplo, deshabilitar las assertions en una

    única clase, pero habilitarlas en todas las

    otras.

    java -ea -da:com.geeksanonymous.Foo 

    > Podemos usar un nombre de paquete (de esta

    forma se deshabilita también en todos lossubpaquetes).>

     

    java -ea -da:com.geeksanonymous...

  • 8/18/2019 Java SCJP clase5

    54/59

    Usando assertions correctamente

    AssertionError es una subclase de Throwable,por lo que puede ser capturada. Pero no

    debemos hacerlo.

    > No debemos usar assertions para validar

    argumentos en métodos públicos: public void doStuff(intx) {

    assert (x > 0); // inapropiado

    }

    > De la misma forma, no debemos usar

    assertions para validar argumentos en la

    línea de comandos.

  • 8/18/2019 Java SCJP clase5

    55/59

    Usando assertions correctamente (II)

    Debemos usar assertions para validar

    argumentos en métodos privados:

     private void doMore(int x) {

    assert (x > 0);// código que utiliza x asumiendo

    que es mayor que 0

    }

  • 8/18/2019 Java SCJP clase5

    56/59

    Usando assertions correctamente (III)

    Podemos usarlas de esta forma:

    switch(x) {

    case 1: y = 3;

    case 2: y = 9;case 3: y = 27;

    default: assert false;

    // No se supone que lleguemos hasta

    aquí

  • 8/18/2019 Java SCJP clase5

    57/59

    No usar assertions que causen

    efectos secundarios>

     

    No está garantizado que las expresiones con

    asserts se ejecuten siempre, por lo tanto, no

    queremos que nuestro código se comporte de

    forma distinta dependiendo si las assertionsestán o no habilitadas. public void doStuff() {

    assert (modifyThings());

    } public boolean modifyThings() {

    y = x++;

    return true; } 

  • 8/18/2019 Java SCJP clase5

    58/59

    Nota

    Si en el examen aparece la palabra

    “apropiado”, no debemos confundirla

    con “legal”. “ Apropiado” se refiere a lo

    forma en la que se SUPONE que algodebe ser usado, mientras que “legal” se

    refiere a la forma en la que algo PUEDE

    ser usado.

  • 8/18/2019 Java SCJP clase5

    59/59

    Preguntas