Java SCJP clase5
-
Upload
raul-oramas-bustillos -
Category
Documents
-
view
227 -
download
0
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