Fundamentos de Programación FPRG
Tema 6. Estructuras de Control
v. 2.0
Miguel A. de Miguel [email protected]
Fundamentos de Programación 2
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 3
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 …
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 5
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 6
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 7
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
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 9
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 10
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 11
Alternancia switch
private int numeroAnio;
public Anio(int valor) { numeroAnio=valor; } public boolean esBisiesto() {
return ((numeroAnio % 4 == 0) &&
(numeroAnio % 100 != 0))) ||
(numeroAnio % 400 == 0);
} }
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 13
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 14
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 15
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)}
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 17
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 18
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 19
Excepciones
n
En cualquier programa se producen comportamientos anómalos y errores
n Correcto: Sin errores y capaz de cumplir requisitos
n Robusto: Capaz de funcionar 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 tratamiento de error1
Correcto Robusto
Jerarquía de Clases de Excepciones
n
Java representa las excepciones y errores como objetos instancia de clases de excepciones
Throwable
Error Exception
RuntimeException MisExcepcionesChequeadas
ExcepcionesSinChequeos
Fundamentos de Programación 21
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 22
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 23
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;
}
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 25
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 26
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 27
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);
} } }
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 29
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;
} } }