Las sentencias de control de flujo determinan el orden en que se ejecutar�n las otras sentencias dentro del programa. El lenguaje Java soporta varias sentencias de control de flujo, incluyendo.
Sentencias | palabras clave |
toma de decisiones | if-else, switch-case |
bucles | for, while, do-while |
excepciones | try-catch-finally, throw |
miscelaneas | break, continue, label:, return |
Nota: Aunque goto es una palabra reservada, actualmente el lenguaje Java no la soporta. Podemos utilizar las rupturas etiquetadas en su lugar.
�La sentencia if-else
La sentencia if-else de java proporciona a los programas la posibilidad de ejecutar selectivamente otras sentencias bas�ndose en alg�n criterio.
Por ejemplo, supon que tu programa imprime informaci�n de depurado bas�ndose en el valor de una variable booleana llamada DEBUG. Si DEBUG fuera verdadera true, el programa imprimir�a la informaci�n de depurado, como por ejemplo, el valor de una variable como x. Si DEBUG es false el programa proceder� normalmente. Un segmento de c�digo que implemente esto se podr�a parecer a este.
. . . if (DEBUG) System.out.println("DEBUG: x = " + x); . . .
Esta es la versi�n m�s sencilla de la sentencia if: la sentencia gobernada por if se ejecuta si alguna codici�n es verdadera. Generalmente, la forma sencilla de if se puede escribir as�.
if (expresi�n) sentencia
Pero, �y si quieres ejecutar un juego diferente de sentencias si la expresi�n es falsa? Bien, puedes utilizar la sentencia else. Echemos un vistazo a otro ejemplo. Supon que tu programa necesita realizar diferentes acciones dependiendo de que el usuario pulse el bot�n OK o el bot�n Cancel en un ventana de alarma. Se podr�a hacer esto utilizando una sentencia if.
. . . // Respuesta dependiente del boto�n que haya pulsado el usuario // OK o Cancel . . . if (respuesta == OK) { . . . // C�digo para la acci�n OK . . . } else { . . . // c�digo para la acci�n Cancel . . . }
Este uso particular de la sentencia else es la forma de capturarlo todo.
Existe otra forma de la sentecia else, else if que ejecuta una sentencia basada en otra expresi�n. Por ejemplo, supon que has escrito un programa que asigna notas basadas en la puntuaci�n de un examen, un Sobresaliente para una puntuaci�n del 90% o superior, un Notable para el 80% o superior y dem�s. odr�as utilizar una sentencia if con una serie de comparaciones else if y una setencia else para escribir este c�digo.
int puntuacion; String nota; if (puntuacion >= 90) { nota = "Sobresaliente"; } else if (puntuacion >= 80) { nota = "Notable"; } else if (puntuacion >= 70) { nota = "Bien"; } else if (puntuacion >= 60) { nota = "Suficiente"; } else { nota = "Insuficiente"; }
Una sentencia if puede tener cualquier n�mero de sentencias de acompa�amiento else if.
Podr�as haber observado que algunos valores de puntuacion pueden satisfacer m�s una de las expresiones que componen la sentencia if. Por ejemplo, una puntuaci�n de 76 podr�a evaluarse como true para dos expresiones de esta sentencia:puntuacion >= 70 y puntuacion >= 60.
Sin embargo, en el momento de ejecuci�n, el sistema procesa una sentencia if compuesta como una s�la; una vez que se ha satisfecho una condici�n (76 >= 70), se ejecuta la sentencia apropiada (nota = "Bien";), y el control sale fuera de la sentencia if sin evaluar las condiciones restantes.
�La sentencia switch
La sentencia switch se utiliza para realizar sentencias condicionalmente basadas en alguna expresi�n. Por ejemplo, supon que tu programa contiene un entero llamado mes cuyo valor indica el mes en alguna fecha. Supon que tambi�n quieres mostrar el nombre del mes bas�ndose en su n�mero entero equivalente. Podr�as utilizar la sentencia switch de Java para realizar esta tarea.
int mes; . . . switch (mes) { case 1: System.out.println("Enero"); break; case 2: System.out.println("Febrero"); break; case 3: System.out.println("Marzo"); break; case 4: System.out.println("Abril"); break; case 5: System.out.println("May0"); break; case 6: System.out.println("Junio"); break; case 7: System.out.println("Julio"); break; case 8: System.out.println("Agosto"); break; case 9: System.out.println("Septiembre"); break; case 10: System.out.println("Octubre"); break; case 11: System.out.println("Noviembre"); break; case 12: System.out.println("Diciembre"); break; }
La sentencia switch eval�a su expresi�n, en este caso el valor de mes, y ejecuta la sentencia case apropiada.
Decidir cuando utilizar las sentencias if o switch dependen del juicio personal. Puedes decidir cual utilizar bas�ndose en la buena lectura del c�digo o en otros factores.
Cada sentencia case debe ser �nica y el valor proporcionado a cada sentencia case debe ser del mismo tipo que el tipo de dato devuelto por la expresi�n proporcionada a la sentencia switch.
Otro punto de interes en la sentencia switch son las sentencias break despu�s de cada case.
La sentencia break hace que el control salga de la sentencia switch y contin�e con la siguiente l�nea.
La sentencia break es necesaria porque las sentencias case se siguen ejecutando hacia abajo. Esto es, sin un break expl�cito, el flujo de control seguir�a secuencialmente a trav�s de las sentencias case siguientes.
En el ejemplo anterior, no se quiere que el flujo vaya de una sentencia case a otra, por eso se han tenido que poner las sentencias break.
Sin embargo, hay ciertos escenario en los que querr�s que el control proceda secuencialmente a trav�s de las sentencias case. Como este c�digo que calcula el n�mero de d�as de un mes de acuerdo con el ritmico refr�n que dice "Treinta dias tiene Septiembre...".
int mes; int numeroDias; . . . switch (mes) { case 1. case 3. case 5. case 7. case 8. case 10. case 12. numeroDias = 31; break; case 4. case 6. case 9. case 11. numeroDias = 30; break; case 2. if ( ((ano % 4 == 0) && !(ano % 100 == 0)) || ano % 400 == 0) ) numeroDias = 29; else numeroDias = 28; break; }
Finalmente, puede utilizar la sentencia default al final de la sentencia switch para manejar los valores que no se han manejado expl�citamente por una de las sentencias case.
int mes; . . . switch (mes) { case 1: System.out.println("Enero"); break; case 2: System.out.println("Febrero"); break; case 3: System.out.println("Marzo"); break; case 4: System.out.println("Abril"); break; case 5: System.out.println("Mayo"); break; case 6: System.out.println("Junio"); break; case 7: System.out.println("Julio"); break; case 8: System.out.println("Agosto"); break; case 9: System.out.println("Septiembre"); break; case 10: System.out.println("Octubre"); break; case 11: System.out.println("Noviembre"); break; case 12: System.out.println("Diciembre"); break; default: System.out.println("Ee, no es un mes v�lido!"); break; }
�Sentencias de Bucle
Generalmente hablando, una sentencia while realiza una acci�n mientras se cumpla una cierta condici�n. La sintaxis general de la sentencia while es.
while (expresi�n) sentencia
Esto es, mientras la expresi�n sea verdadera, ejecutar� la sentencia.
sentencia puede ser una s�la sentencia o puede ser un bloque de sentencias. Un bloque de sentencias es un juego de sentencias legales de java contenidas dentro de corchetes('{'y '}').
Por ejemplo, supon que adem�s de incrementar contador dentro de un bucle while tambi�n quieres imprimir el contador cada vez que se lea un car�cter. Podr�as escribir esto en su lugar.
. . . while (System.in.read() != -1) { contador++; System.out.println("Se ha leido un el car�cter = " + contador); } . . .
Por convenci�n el corchete abierto '{' se coloca al final de la misma l�nea donde se encuentra la sentencia while y el corchete cerrado '}' empieza una nueva l�nea indentada a la l�nea en la que se encuentra el while.
Adem�s de while Java tiene otros dos constructores de bucles que puedes utilizar en tus programas.
el bucle for y el bucle do-while.
Primero el bucle for. Puedes utilizar este bucle cuando conozcas los l�mites del bucle (su instrucci�n de inicializaci�n, su criterio de terminaci�n y su instrucci�n de incremento). Por ejemplo, el bucle for se utiliza frecuentemente para iterar sobre los elementos de un array, o los caracteres de una cadena.
// a es un array de cualquier tipo . . . int i; int length = a.length; for (i = 0; i < length; i++) { . . . // hace algo en el elemento i del array a . . . }
Si sabes cuando estas escribiendo el programa que quieres empezar en el inicio del array, parar al final y utilizar cada uno de los elementos. Entonces la sentencia for es una buena elecci�n. La forma general del bucle for puede expresarse asi.
for (inicializaci�n; terminaci�n; incremento) sentencias
inicializaci�n es la sentencia que inicializa el bucle -- se ejecuta una vez al iniciar el bucle.
terminaci�n es una sentecia que determina cuando se termina el bucle. Esta expresi�n se eval�a al principio de cada iteracci�n en el bucle. Cuando la exprei�n se eval�a a false el bucle se termina.
Finalmente, incremento es una expresi�n que se invoca en cada interacci�n del bucle. Cualquiera (o todos) de estos componentes puden ser una sentencia vac�a (un punto y coma).
Java proporciona otro bucle, el bucle do-while,que es similar al bucle while que se vi� al principio, excepto en que la expresi�n se aval� al final del bucle.
do { sentencias } while (Expresi�n Booleana);
La sentencia do-while se usa muy poco en la construcci�n de bucles pero tiene sus usos. Por ejemplo, es conveniente utilizar la sentencia do-while cuando el bucle debe ejecutarse al menos una vez. Por ejemplo, para leer informaci�n de un fichero, sabemos que al menos debe leer un car�cter.
int c; InputStream in; . . . do { c = in.read(); . . . } while (c != -1);
�Sentencias de Manejo de Excepciones
Cuando ocurre un error dentro de un m�todo Java, el m�todo puede lanzar una excepci�n para indicar a su llamador que ha ocurrido un error y que el error est� utilizando la sentencia throw.
El m�todo llamador puede utilizar las sentencias try, catch, y finally para capturar y manejar la excepci�n.
Puedes ver Manejar Errores Utilizando Excepciones para obtener m�s informaci�n sobre el lanzamiento y manejo de excepciones.
�Sentencias de Ruptura
Ya has visto la sentencia break en acci�n dentro de la sentencia switch anteriormente. Como se observ� anteriormente, la sentencia break hace que el control del flujo salte a la sentencia siguiente a la actual.
Hay otra forma de break que hace que el flujo de control salte a una sentencia etiquetada.
Se puede etiquetar una sentencia utilizando un identificador legal de Java (la etiqueta) seguido por dos puntos (:) antes de la sentencia.
SaltaAqui: algunaSentenciaJava
Para saltar a la sentencia etiquetada utilice esta forma de la sentencia break.
break SaltaAqui;
Las rupturas etiquetadas son una alternativa a la sentencia goto que no est� soportada por el lenguaje Java.
Se puede utiliza la sentencia continue dentro de un bucle para saltar de la sentencia actual hacia el principio del bucle o a una sentencia etiquetada.
Considera esta implementaci�n del m�todo indexOf() de la clase String que utiliza la forma de continue que contin�a en una sentencia etiquetada.
public int indexOf(String str, int fromIndex) { char[] v1 = value; char[] v2 = str.value; int max = offset + (count - str.count); test. for (int i = offset + ((fromIndex < 0) ? 0 : fromIndex); i <= max ; i++) { int n = str.count; int j = i; int k = str.offset; while (n-- != 0) { if (v1[j++] != v2[k++]) { continue test; } } return i - offset; } return -1; }
Nota: S�lo se puede llamar a la sentencia continue desde dentro de un bucle.
Y finalmente la sentencia return.
Esta sentencia se utiliza para salir del m�todo actual y volver a la sentencia siguiente a la que origin� la llamada en el m�todo original.
Existen dos formas de return: una que devuelve un valor y otra que no lo hace.
Para devolver un valor, simplemente se pone el valor (o una expresi�n que calcule el valor) detr�s de la palabra return.
return ++count;
El valor devuelto por return debe corresponder con el tipo del valor de retorno de la declaraci�n del m�todo.
Cuando un m�todo se declara como void utiliza la forma de return que no devuelve ning�n valor.
return;