Sunteți pe pagina 1din 15

03/11/16

Fundamentos de Programación
FPRG
Tema 6. Estructuras de Control
v. 2.0

Miguel A. de Miguel
mmiguel@dit.upm.es

Temario
n  Tema 6. Estructuras de
control
n  Alternativas if y switch
n  Repetitivas: while, do, for
n  Rupturas de bucle: break,
continue
n  Tipos Compuestos
n  Excepciones:
n  Concepto
n  Creación
n  Levantamiento
n  Captura
n  Excepciones en lo métodos

Fundamentos de Programación 2

1
03/11/16

Ejecución secuencial
n  Los programas ejecutan secuencias de
sentencias
n  El final de una secuencia:
n  ; para llamadas simples de método y asignaciones
n  El final del cuerpo de una sentencia de control
n  Terminada una sentencia se ejecuta la siguiente
n  Las sentencias de control están determinadas
por palabras reservadas: if, for, while …

Fundamentos de Programación 3

Alternancia if
n  Estructura general
if (expresion boolean) cuerpo-then
else cuerpo-else

parte else es opcional


n  Las partes cuerpo incluyen
n  Una única sentencia
n  Un bloque de sentencias entre { }
n  Si la expresión es true se ejecuta cuerpo-then
n  Si la expresión es false se ejecuta cuerpo-else
n  Si la expresión es false y no hay else se ejecuta la
sentencia que sigue al if

Fundamentos de Programación 4

2
03/11/16

Bloques de sentencias
n  Los cuerpos de las sentencias de control pueden
ser:
n  Bloques de varias sentencias entre llaves
n  Una única sentencia
n  Usamos llaves cuando el cuerpo es mas de una
sentencia
n  Esto delimita el final del cuerpo
n  Nos determina donde comienza la primera sentencia
que sigue a la sentencia de control

Fundamentos de Programación 5

Condiciones
n  La condición es una expresión boolean
n  Operaciones relaciones
n  Operaciones lógicas
n  Variable boolean
n  Métodos que devuelven boolean
n  Debemos evitar expresiones que creen efectos
laterales (modificar objetos)
n  Algunas veces las expresiones no se ejecutan
completamente
n  Basta con ejecutar una parte para saber si es true o
false
n  expresion1 && expresion2 expresion3 || expresion4
Fundamentos de Programación 6

3
03/11/16

Partes else
n  Cuando el cuerpo de una sentencia if es otra
sentencia if, el else hace referencia al if mas
próximo
if (condicion1) if (condicion2) sentencia1
else sentencia2

n  Bloques vacíos
if (condicion1)
if (condicion2) sentencia1
else {}
else sentencia2

Fundamentos de Programación 7

Alternancias múltiples
n  Tratamos los diferentes valores de una
expresión de formas distintas
if (expresion == valor0) sentencia0;
else if (expresion == valor1) sentencia1;
else if (expresion == valor2) sentencia2;
else if (expresion == valor3) sentencia3;
else sentencia4;

n  La expresión se evalúa tantas veces como if


ejecutamos
n  Ineficiente y poco legible

Fundamentos de Programación 8

4
03/11/16

Alternancia switch
switch (expresion) {
case valor0:
sentencia0; break;
case valor1:
sentencia1; break;
case valor2:
sentencia2; break;
default:
sentencia4;
}
n  expresion debe ser entero, boolean, carácter,
enumerado o String
n  La misma alternancia no puede estar repetida
n  Los valores de case son constantes o literales
n  default es opcional
n  La sentencia break nos saca del switch, si no la
incluimos se ejecuta lo que sigue
Fundamentos de Programación 9

Alternancia switch
public class Anio {
public enum Meses {ENERO, FEBRERO, MARZO, ABRIL, MAYO, JUNIO, JULIO,
AGOSTO, SEPTIEMBRE, OCTUBRE, NOVIEMBRE, DICIEMBRE}
public static void main(String[] args) {
Meses mes = Meses.valueOf(args[1]);
int anio = Integer.parseInt(args[0]);
int numDias = 0;

switch (mes) {
case ENERO: case MARZO: case MAYO: case JULIO:
case AGOSTO: case OCTUBRE: case DICIEMBRE:
numDias = 31; break;
case ABRIL: case JUNIO: case SEPTIEMBRE: case NOVIEMBRE:
numDias = 30; break;
case FEBRERO:
if ((new Anio(anio)).esBisiesto())
numDias = 29;
else
numDias = 28;
break;
default:
numDias=0; break;
}
System.out.println("Numbero de dias = " + numDias);
}
Fundamentos de Programación 10

5
03/11/16

Alternancia switch
private int numeroAnio;
public Anio(int valor) { numeroAnio=valor; }

public boolean esBisiesto() {


return ((numeroAnio % 4 == 0) &&
(numeroAnio % 100 != 0))) ||
(numeroAnio % 400 == 0);
}
}

Fundamentos de Programación 11

Bucle while
n  Estructura general
while (expresion boolean) cuerpo-while

n  La expresión boolean se evalúa al llegar, si es true se


ejecuta el cuerpo, si no se sigue con la siguiente
sentencia
n  Completado el cuerpo se vuelve a evaluar la expresión
boolean,
n  Se vuelve a ejecutar el cuerpo hasta que deje de valer true
n=expresion; factorial=1;
while (n > 1) {
factorial=factorial*n;
n=n-1;
Fundamentos de Programación 12
}

6
03/11/16

Bucle do-while
n  Estructura general
do {
cuerpo-do
} while (expresion boolean)

n  El cuerpo se ejecuta al menos una vez


n  Especialmente útil cuando el la expresión dependen de
resultados que evalúa el cuerpo
n  Se evalúa la expresión boolean y si es true se vuelve a
ejecutar el cuerpo hasta que la expresión sea false
n  Equivalente a: (debemos reescribir el cuerpo)
cuerpo-do
while (expresion boolean) cuerpo-do
Fundamentos de Programación 13

Bucle for
n  Estructura general
for (inicializacion; condicion; actualizacion) {
cuerpo-for
}
n  inicializacion se ejecuta una sola vez al llegar al
bucle. Puede incluir declaración de variables
que afectan al cuerpo
n  Mientras condicion (expresión boolean) se
cumpla el cuerpo se ejecuta. Al menos se
evalúa después de inicializacion
n  Después de terminar el cuerpo, y antes de
evaluar condicion se ejecuta actualizacion
for (int i=0; i < 20; i=i+1) m=m+i;
Fundamentos de Programación 14

7
03/11/16

Ejercicio
Escriba una clase que permita calcular el número PI con
una precisión de "n" decimales. El parámetro "n" deberá
introducirse por teclado:
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
String entrada = stdin.readLine();
int dig=Integer.parseInt(entrada);

Puede utilizar la siguiente fórmula para aproximar el


valor de PI/4:
PI/4 = 1 - 1/3 + 1/5 - 1/7 + ... = Suma(n=0,infinito){(-1)^n/(2n+1)}

Fundamentos de Programación 15

Estructura de salto break


n  Estructura general
break;
n  Es una sentencia en un cuerpo de bucle
(do-while, while, y for) y de alternancias
switch
n  Da por terminado el bucle o switch y
sigue con la sentencia al bucle/switch
n  Afecta al bucle o switch de anidamiento
mas interno en el que se encuentre
Fundamentos de Programación 16

8
03/11/16

Estructura de salto continue


n  Estructura general
continue;
n  Es una sentencia en un cuerpo de bucle (do-
while, while, y for)
n  Da por terminado el cuerpo del bucle y vuelve a
evaluar condición (actualización en el caso de
for)
n  Afecta al bucle de anidamiento mas interno en
el que se encuentre
for (int i=1; i < 20; i=i+1) {
if (esPrimo(i)) continue;
imprime(i);
}
Fundamentos de Programación 17

Ejercicio
Escriba el cuerpo de un método “complementario” con la
siguiente cabecera:
boolean[][] complementario(boolean[][] matriz) {

}

Que devuelve una nueva matriz de las mismas dimensiones que


matriz pero sus valores son el negado de los elementos de matriz.

Fundamentos de Programación 18

9
03/11/16

Excepciones
n  En cualquier programa se producen
comportamientos anómalos y errores
n  Correcto: Sin errores y capaz
Correcto
de cumplir requisitos
n  Robusto: Capaz de funcionar
Robusto
incluso en situaciones anormales
n  La detección y control de errores hacen los
programas mas difíciles de entender
if (!error1) {
sentencias con error2
if (!error2) {
sentencias
else tratamiento de error2
else tratamientoFundamentos
de error1de Programación 19

Jerarquía de Clases de Excepciones


n  Java representa las excepciones y
errores como objetos instancia de
clases de excepciones
Throwable

Error Exception

MisExcepcionesChequeadas RuntimeException

ExcepcionesSinChequeos
Fundamentos de Programación 20

10
03/11/16

Levantamiento de Excepciones
n  Estructura general
throw ObjetoDeTipoExcepcion;
n  Aborta lo que se ejecuta y se cede el control a

donde se hace el tratamiento:


n  throw está dentro de un manejador de excepciones
que trata ese tipo de excepciones
n  La tratamos en el manejador
n  throw no está dentro de un manejador, pero el
método levanta ese tipo de excepciones
modificadores Tipo nombre
(Lista parametros) throws ClaseExcep1, ClaseExcep2…
n  Se aborta el método y esa excepción se levanta donde se

hizo la llamada
Fundamentos de Programación 21

Excepciones de Máquina Virtual Java


n  La máquina virtual también puede levantarlas
mientras ejecuta el programa
n  Algunos problemas que pueden provocar
levantamiento de excepciones:
n  Intentamos usar una referencia que vale null
Stringd=null;
d.substring(5);
n  Intentamos hacer una conversión (casting) que no se
puede realizar
Integer i=(Integer) x;
n  Errores de cálculo como división por cero
int z=0;
j=i/z;
n  No se encuentra el fichero .class de una clase que
queremos usar
Clase1 c=new Clase1();
Fundamentos de Programación 22

11
03/11/16

Levantamiento de Excepciones
while (x > 0) {
switch x/n {
case 0 : t=t+” cero”; break;
case 1 : t=t+” uno”; break;
:
case 9 : t=t+” nueve”; break;
default:
throw new Exception(“Algo va mal”);
break;
}
x=x%n;
n=n/10;
}
Fundamentos de Programación 23

Objetos de tipo Exception


n  La clase del objeto asociado a throw debe se Exception
o una de sus herederas
class NuevaExcepcion extends Exception {
}
n  Solo esos tipos de objetos pueden aparecer en los

throw
n  Solo esas clases pueden aparecer en la parte exception
de los métodos
n  Solo esas clases pueden aparecer en los catch de los

manejadores de excepción
new Exception(“mesaje de error”);
new ClaseExcepcion(parametrosError);

Fundamentos de Programación 24

12
03/11/16

Manejadores de Excepciones
n  Estructura general
try { cuerpo-try
} catch (ClaseExcepcion1 ref1) { tratamiento ClaseExcepcion1
} catch (ClaseException2 ref2) {tratamiento ClaseExcepcion2
} finally { cuerpo finally
}
n  cuerpo-try representa la ejecución en condiciones normales

n  catch indica como tratar cada tipo de excepción en caso de que un

throw o una llamada a método la levante


n  Cuando una excepción salta se busca (en el orden de la declaración)
un catch que pueda tratarlo (el tipo de la excepción es compatible)
n  Si no hay ninguno, la excepción sigue levantada y la debe tratar
aquello que incluya la sentencia try
n  finally es opcional e incluye aquello que debemos ejecutar tanto si
se produce como si no una excepción
Fundamentos de Programación 25

Manejadores de Excepciones
n  Cuando llamamos a un método que levanta una excepción
debemos:
n  Incluir la llamada dentro de un try que tiene asociado el tratamiento
de ese tipo de excepción
n  El método que incluye la llamada debe indicar que él también puede
levantar la llamada
n  Formas de tratar un error:
n  El try-catch cortan la excepción pero debe darle un tratamiento y
buscar una solución a ese tipo de error
n  Los métodos pasan el error a sus llamadores
n  Si ningún método contiene un manejador que trate la excepción, se
aborta la ejecución y la máquina virtual saca un mensaje como:
mesaje de error
at nombreClase1.nombreMétodo1 (nombreFichero1.java:numeroLínea)
at nombreClase2.nombreMétodo2 (nombreFichero2.java:numeroLínea)
at nombreClase3.nombreMétodo3 (nombreFichero3.java:numeroLínea)
:
Fundamentos de Programación 26

13
03/11/16

Ejemplo
public static void main (String[] arg) {
try {
double d= Double.parseDouble(arg[0]);
if (d < 0)
throw new Exception(arg[0]+“ no puede ser negativo”);
System.out.println(Math.sqrt(d));
} catch (NumberFormatException e) {
System.err.println(arg[0]+” no es un número real”);
} catch (Exception e) {
System.err.println (e);
}
}
}

Fundamentos de Programación 27

Ejemplo
class CuentaBancaria {
public enum EstadoCuenta {Activa, Cerrada, Bloqueada}
private double saldo=0.0;
private EstadoCuenta estado=EstadoCuenta.Activa;

public void depositar(double cantidad) throws Exception {


if (estado != EstadoCuenta.Activa)
throw new Exception(“Solo se puede trabajar con cuentas activas”);
saldo=saldo+cantidad;
}

public void retirar(double cantidad) throws Exception {


if (estado != EstadoCuenta.Activa)
throw new Exception(“Solo se puede trabajar con cuentas activas”);
if (saldo < cantidad)
throw new Exception(“No hay saldo disponible”);
saldo=saldo-cantidad;
}

Fundamentos de Programación 28

14
03/11/16

Ejemplo
public void transferencia(double cantidad, CuentaBancaria destino)
throws Exception {
retirar(cantidad);
try destino.depositar(cantidad));
catch (Exception e) {
depositar(cantidad); // devolvemos lo retirado
throw e;
}
}
}

Fundamentos de Programación 29

15

S-ar putea să vă placă și