JavaCompleto (Apoyo)
JavaCompleto (Apoyo)
Las variables son contenedores de información (comúnmente, llamada "datos" del inglés "data"). Estos datos podrán ser de diferentes tipos, números enteros,
números decimales, texto, etc.
Por ejemplo, si tenemos un número como 5479396, podríamos almacenarlo en una variable con tipo de dato "int", el cual ahora explicaré.
Imagina que te vas de mudanza y tienes que empaquetar todas tus cosas. Normalmente, si quieres que al llegar a tu nueva casa, no tengas que abrirlo todo para
saber lo que hay en cada caja, las etiquetarás y pondrás una caja para cada cosa. Unas cuantas, de ropa, otra para videojuegos, otra para los periféricos de tu PC,
etc.
Pues bien, en Java, con las variables, ocurre lo mismo, hay que indicar de qué tipo es cada caja en el momento de crearla.
• Tipo de dato.
• Nombre de variable (identificador).
• Asignador.
• Valor.
Plain Text
1 tipo nombre = valor;
Aunque parece mucha cosa, es bien fácil. Ahora verás.
El tipo de dato es lo que te he explicado, de momento, para este capítulo utilizaremos solo un tipo y en el siguiente te lo explico bien.
El nombre será un nombre que le darás a esa variable, para que luego, podamos llamarla en el programa.
El asignador no es más que un operador llamado asignación, el cual sirve para decirle a Java, qué valor tiene que almacenar o asociar a una variable.
De estas cuatro partes, lo único que va a poder cambiar durante el programa, es la parte del valor.
Para declarar una variable en Java, tienes que darle un tipo de dato, y darle un nombre.
Para este capítulo, utilizaré una variable de tipo byte, que admite valores numéricos muy pequeños. Desde el -128 al 127.
Java
1
byte numero1;
Puedes de dejarla así, sin un valor inicial. El valor se lo puedes dar en otra parte del programa. Esto se utiliza cuando no sabes todavía qué valor tiene que llevar la
variable. Por ejemplo. Creas una variable que almacenará el resultado de una suma. No sabes nunca cuál va a ser el resultado, dependerá de los números que se
sumen.
Java
1
byte numero1 = 100;
Reasignar valores, es la acción de darle un valor a una variable cuando ya tiene uno, es decir, cuando ya se ha inicializado.
Java
1
byte numero1 = 100;
2
numero1 = 35;
Para llamar a una variable en Java, solo tenemos que usar su propio nombre. Por ejemplo, quiero llamar a la variable para imprimir su valor en la consola. En la
línea 4 la llamo para reasignarle el valor 35. En la 5, la llamo para imprimir su valor.
1
public class Main {
2
public static void main(String[] args) {
3
byte numero1 = 100;
4
numero1 = 35;
5
System.out.println(numero1);
6
}
7
}
¿Java es case-sensitive?
Sí, Java es "case-sensitive". Todo lo que escribas, es sensible a mayúsculas y minúsculas. Esto serían tres variables diferentes:
Java
1
byte Numero1 = 100;
2
byte numero1 = 100;
3
byte NUMERO1 = 100;
En Java, casi todos los tipos primitivos, son para almacenar (guardar) números.
El tipo de dato numérico byte de Java crea los contenedores (variables) más pequeños para números enteros que existen en Java. Pueden almacenar números
negativos desde el -128 hasta el 127 positivo. Un total de 256 posibles valores si contamos el 0. Esto ocupa 1 byte en la memoria RAM.
Java
1
byte numero1 = 100;
Si quieres, puedes ir probando de imprimir en la consola los valores de cada tipo que vaya explicando, puedes ver como lo hago en el vídeo de este capítulo.
Para que empieces a entender estos espacios en memoria, es importante que sepas que es un byte.
Normalmente, se confunde bit y byte, pero recuerda que un byte son 8 bits y que 1 bit es una octava parte de un byte. Recuérdalo de la forma que se te quede más
fácil.
Después del byte, llegamos al kilobyte, que son 1024 bytes, del kilobyte al megabyte, que son 1024 kilobytes, del megabyte al gigabyte, que son 1024 megabytes, y
así hasta otras medidas mucho más grandes.
Por lo tanto, si en un PC hay 4 GB de memoria RAM tendremos 4096 megabytes de memoria o lo que es lo mismo, 4194304 kilobytes o 4294967296 bytes.
Pues bien, ahora, ya puedes hacerte una idea de los datos que caben en la memoria RAM. A partir de ahora, daré los datos en bytes o bits si son más pequeños
que un byte.
No confundas memoria RAM con almacenamiento. He visto que mucha gente llama memoria al espacio en disco para guardar archivos. Una cosa es el
"almacenamiento" donde guardas tus archivos y otra es la "memoria" del PC, que es la que guarda temporalmente datos de los programas.
Short
Este tipo de entero puede almacenar desde el valor -32,768 hasta el 32,767. Un total de 65536 posibles valores que dan un tamaño al contenedor de 2 bytes.
Java
1
short numero1 = 20435;
Int
Este tipo de dato suele ser el más utilizado, ya que cubre con la mayoría de necesidades para almacenar enteros y no ocupa una barbaridad de espacio en
memoria. Los valores posibles van desde el número -2,147,483,648 hasta el 2,147,483,647. Por lo tanto, tiene 4.294,967,296 posibles valores y un tamaño en
memoria de 4 bytes.
Java
1
int numero1 = 776855647;
Long
El tipo de dato long es el más grande de los enteros. Este tiene un tamaño de 8 bytes. Los valores van desde el -9,223,372,036,854,775,808 hasta el
9,223,372,036,854,775,807.
Java
1
long numero1 = 9223372036854775807L;
El tipo de dato primitivo float de Java, sirve para almacenar valores decimales de hasta 7 dígitos. Este tipo ocupa en memoria como un int, 4 bytes.
Java
1
float pi = 3.141592F;
Java
1
double pi = 3.141592653589793;
Este tipo de dato primitivo, solo puede almacenar un carácter, lo que deja un tipo de dato que ocupa 2 bytes en memoria. Permite 65536 posibles valores como el
dato numérico short.
Java
1
char letra = 'A';
El tipo de dato boolean solo puede contener dos posibles valores, true o false. Verdadero o falso. Estos sirven para que los programas puedan evaluar diferentes
posibilidades. Ocupa en memoria 1 solo bit (esto es, una octava parte de 1 byte tal y como expliqué anteriormente).
Java
1
boolean resultado1 = true;
2
boolean resultado = false;
Todo el temario del curso Java aquí.
¿Qué tipo de dato es el más correcto para almacenar cada uno de los siguientes datos?
1. Q
2. 5000
3. 31
4. 87.46457
5. 7.678789789
6. True
7. -67.8
Las soluciones a estos ejercicios las encontrarás en el próximo capítulo del curso.
• Ejercicio 1:
Java
1
byte numero;
• Ejercicio 2:
Java
1
byte numero;
2
numero = 75;
• Ejercicio 3:
Java
1
byte numero = 75;
• Ejercicio 4:
Java
1
public class Main {
2
public static void main(String[] args) {
3
byte numero = 75;
4
System.out.println(numero);
5
}
6
}
Java
1
public class Main {
2
public static void main(String[] args) {
3
System.out.print(10 + 56);
4
}
5
}
Resultado en la consola
66
Para poder realizar operaciones aritméticas y almacenar el resultado para poder usarlo en cualquier parte del programa, necesitas una variable que guarde el
resultado de la operación.
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 10;
4
int numero2 = 56;
5
int resultado = numero1 + numero2;
6
System.out.print(resultado);
7
}
8
}
Resultado en la consola
66
Esta vez, he puesto los valores en variables y el resultado se guarda en una tercera variable llamada "resultado". Finalmente, se imprime en la consola con un
print().
Con lo que hemos dado en el curso, todavía no puedes emplear este resultado para nada más que un print() en la consola, sin embargo, verás que muy pronto
puedes efectuar muchas cosas con los resultados almacenados en variables.
Por cierto, los tamaños de los números, caben perfectamente en un tipo byte, ya que son muy pequeños, sin embargo, puedes usar tipos de datos más grandes
para no tener que estar teniendo en cuenta si te cabe un número en una variable o no. Esto es algo que tendrás que tener en cuenta cuando empieces a realizar
programas por tu cuenta. De momento, que sepas que el tipo de dato más común para números enteros en Java es "int".
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 10;
4
int numero2 = 56;
5
int resultado = numero1 - numero2;
6
System.out.print(resultado);
7
}
8
}
Resultado en la consola
-46
¿Por qué aparece -46? En esta operación, se está restando el valor de numero2 al de numero1, lo que es lo mismo que poner 10 - 56 = -46.
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 10;
4
int numero2 = 56;
5
int resultado = numero2 - numero1;
6
System.out.print(resultado);
7
}
8
}
Resultado en la consola
46
Operación de multiplicación en Java
Para hacer operaciones de multiplicación en Java, lo haremos con el operador "*".
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 10;
4
int numero2 = 56;
5
int resultado = numero2 * numero1;
6
System.out.print(resultado);
7
}
8
}
Resultado en la consola
560
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 10;
4
int numero2 = 3;
5
int resultado = numero1 * numero2;
6
System.out.print(resultado);
7
}
8
}
Resultado en la consola
3
Todo el temario del curso Java aquí.
Ejercicios de Java
Te dejo unos cuantos ejercicios relacionados con el temario. Las soluciones, las encontrarás en el siguiente capítulo.
1. Realiza una operación de suma con tres variables cuyo resultado, se almacene en una cuarta.
2. Muestra el resultado anterior en la consola.
3. Sin copiar el código y mirarlo en un IDE ¿Crees que lo que hay en la variable "resultado" es correcto?
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 3;
4
int resultado = 10 / numero1;
5
System.out.print(resultado);
6
}
7
}
• Ejercicio 1:
En realidad, esto era una pregunta trampa, ya que al no llevar la palabra "final" delante del tipo de dato, hace que sea una variable normal y no una constante.
• Ejercicio 2:
Java
1
final float numero = 300.56F;
Gracias a estos dos valores booleanos, podemos hacer que el programa haga una cosa si se cumple cierta condición ("true") y que haga otra diferente si no se
cumple ("false").
== Igual que
!= Diferente que
Java
1
boolean comparacion = numero1 > numero2;
La evaluación está en una variable de tipo boolean. Lo que le damos como valor, es lo que se conoce como comparación o expresión. Esta expresión dice "numero1
es mayor que numero2".
Si el valor que tiene la variable numero1 es mayor que el que tiene numero2, lo que se almacena en la variable boolean será un "true", que quiere decir, que es
cierto, verdadero.
En cambio, si en la expresión le ponemos una mentira, que numero1 no es mayor que numero2, nos dará un resultado de "false" (falso).
Así de simple es la lógica booleana, o es cierto o es falso lo que le pongamos a las variables booleanas.
Desde una visión un poco más técnica, piensa que siempre se compara el valor de la izquierda (x) con el de la derecha (y).
Java
1
boolean comparacion = x > y;
El operador mayor que de Java compara si un valor es mayor que otro, así de fácil.
Java
1
public class Main {
2
public static void main(String[] args) {
3
byte numero1 = 10;
4
byte numero2 = 20;
5
boolean comparacion = numero1 > numero2;
6
System.out.print(comparacion);
7
}
8
}
Resultado en la consola
false
¿Por qué devuelve "false" al imprimir la variable booleana? numero1, vale 10, por lo tanto, no es mayor que numero2, estamos mintiendo y Java lo sabe.
El operador de comparación menor que de Java
El operador menor que de Java, compara si un valor es menor que el otro:
Java
1
public class Main {
2
public static void main(String[] args) {
3
byte numero1 = 10;
4
byte numero2 = 20;
5
boolean comparacion = numero1 < numero2;
6
System.out.print(comparacion);
7
}
8
}
Resultado en la consola
true
Esta vez, la expresión es verdadera, ya que numero1 es menor que numero2.
Java
1
public class Main {
2
public static void main(String[] args) {
3
byte numero1 = 10;
4
byte numero2 = 20;
5
boolean comparacion = numero1 >= numero2;
6
System.out.print(comparacion);
7
}
8
}
Resultado en la consola
false
Devuelve false, puesto que numero1, es menor que numero2, ni es mayor, ni es igual.
Java
1
public class Main {
2
public static void main(String[] args) {
3
byte numero1 = 10;
4
byte numero2 = 10;
5
boolean comparacion = numero1 >= numero2;
6
System.out.print(comparacion);
7
}
8
}
Resultado en la consola
true
En este caso, son iguales, por lo tanto, se cumple también y nos da "true".
Java
1
public class Main {
2
public static void main(String[] args) {
3
byte numero1 = 10;
4
byte numero2 = 10;
5
boolean comparacion = numero1 <= numero2;
6
System.out.print(comparacion);
7
}
8
}
Resultado en la consola
true
¿Cómo llamas en la vida cotidiana a este símbolo "="? Al menos, yo le llamo igual.
Si te fijas, para dar valor a las variables, estamos utilizando el operador "=", que es el que se conoce como operador de asignación. Sirve para asignar valores.
En cambio, en las expresiones comparativas como las que acabas de ver, si queremos comparar si dos valores son iguales, necesitaremos utilizar el operador de
comparación de igualdad, que es un doble "=".
Java
1
public class Main {
2
public static void main(String[] args) {
3
byte numero1 = 10;
4
byte numero2 = 10;
5
boolean comparacion = numero1 == numero2;
6
System.out.print(comparacion);
7
}
8
}
Resultado en la consola
true
Si intentes hacer esto, te dará una error (fíjate en el operador de la línea 5):
Java
1
public class Main {
2
public static void main(String[] args) {
3
byte numero1 = 10;
4
byte numero2 = 10;
5
boolean comparacion = numero1 = numero2;
6
System.out.print(comparacion);
7
}
8
}
Error en la consola
java: incompatible types: byte cannot be converted to boolean
El error dice que el tipo byte, no puede ser convertido a boolean.
Esto ocurre porque estoy intentando, por culpa de poner el operador de asignación y no el de comparación en la línea 5.
El valor de numero1, se está intentado asignar directamente a la variable booleana, por eso nos dice que el tipo byte no se puede transformar a boolean.
El tipo boolean, solo puede almacenar los valores "true" y "false", intentar almacenar números, siempre ocasionará errores.
Ya lo sabes, siempre, para comparar el doble igual "==" y para asignar valores, un igual "=".
Java
1
public class Main {
2
public static void main(String[] args) {
3
byte numero1 = 10;
4
byte numero2 = 10;
5
boolean comparacion = numero1 != numero2;
6
System.out.print(comparacion);
7
}
8
}
Resultado en la consola
false
Puesto que son iguales, no se cumple la expresión, es "false".
En cambio, aquí son diferentes, por lo que devuelve "true".
Java
1
public class Main {
2
public static void main(String[] args) {
3
byte numero1 = 10;
4
byte numero2 = 20;
5
boolean comparacion = numero1 != numero2;
6
System.out.print(comparacion);
7
}
8
}
Resultado en la consola
True
Los bloques de código e indentaciones en Java - Master en desarrollo de apps con
Java, Kotlin y Android Studio #8
En este capítulo pasamos a ver lo que son los bloques de código y las indentaciones en Java y en programación general. Un tema totalmente imprescindible para
continuar en el próximo capítulo con las estructuras condicionales.
Bien, cuando hablamos de bloque, en programación, nos referimos a un trozo de código que está delimitado de alguna forma. En Java, son unas llaves { }. Una de
apertura al principio y otra de cierre al final. Así, indicamos donde empieza ese bloque de código y dónde acaba.
Analicemos un programa simple como lo que has visto hasta ahora y veamos donde se delimitan estos bloques.
En la primera línea, tienes lo que se conoce como clase (public class Main). Esto ya lo explicaré más adelante, no te preocupes si no sabes lo que es una clase.
Mira lo que hay al final de la línea 1 ( { ). Eso es una llave de apertura. Esta se cierra al final de todo, en la línea 7.
Cuando enseñe lo que son las clases y los métodos, sabrás de sobra que bloques contienen o pueden contener otros bloques dentro.
Las clases pueden contener entre sus llaves, muchas cosas, entre ellas, métodos, que es lo que empieza en la línea 2. Este método llamado main, es el encargado
de ejecutar las instrucciones que hay en las líneas 3, 4, y 5.
El método, al igual que pasa con la clase, se abre en la línea donde se declara (línea 2) con una llave de apertura y se cierra cuando acaban las instrucciones que
lleva escritas con la llave de cierre (línea 6).
El método es un bloque de código que está dentro de la clase, por este motivo, está envuelto entre las primeras llaves.
Las clases, normalmente llevarán más de un método. De momento, solo utilizamos uno debido a la sencillez de los programas de ejemplo que estoy poniendo.
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 7;
4
int resultado = 10 + numero1;
5
System.out.print(resultado);
6
}
7
}
Por ejemplo, imagina en la vida real, cuando vas a seguir una receta de cocina. En ella, aparecen todos los pasos a seguir para que salga como se espera.
Podríamos definir, más o menos, una receta como un método (conjunto de instrucciones) y la instrucción como cada uno de los pasos a seguir.
Pues así es, al escribir código, le dices a Java, haz esto y luego esto otro.
En el código de arriba, primero (línea 3), le das la orden o instrucción de que inicialice la variable y le asigne un valor. En la línea 4, que inicialice otra variable y le
asigne el resultado de sumar 10 + el valor que tenga la variable anterior. Finalmente, en la línea 5, se le pide que imprima el resultado.
Te dejo el código por si lo quieres probar en tu IDE o editor de texto. Lo importante aquí no es que entiendas su funcionamiento, si no, que te fijes en la estructura de
los bloques.
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 7;
4
int resultado = 10 + numero1;
5
if (resultado > 15){
6
System.out.println("El resultado de la suma es: " + resultado);
7
}
8
for (int x = 0; x <= 10; x++) {
9
System.out.println("El valor es " + x);
10
}
11
}
12
}
Aquí te dejo una imagen para que puedas ver claramente las delimitaciones de cada bloque.
En este ejemplo, la clase empieza en la línea 1 y termina en la 12 (bloque azul). Esta clase será el nivel superior del resto de bloques. Todos ellos deberán estar en
una clase.
Después tenemos el método, que empieza en la línea 2 y se cierra en la 11 (bloque verde). Los métodos son como mini programas necesarios para ejecutar
instrucciones u otros bloques de código. Estos bloques deben ir siempre dentro de una clase.
Finalmente, contamos con bloques de nivel inferior en esta jerarquía (bloques rojos), lo cuales, deberán ir dentro de un método.
Imagina esta estructura como una matrioska. Tenemos una muñeca grande en exterior que contiene al resto y lo mismo sucede en los siguientes niveles.
Indentación en Java
En lenguajes como Python, la indentación es obligatoria para que el programa funcione, en Java esto no ocurre. Sin embargo, es 100% necesario utilizarla como
toca con el fin de que tu programa sea legible y esté muy bien ordenado.
Las indentaciones son las sangrías en programación. Son espacios o tabulaciones que ordenan de una manera en concreto el código en la hoja de texto donde lo
escribimos.
A continuación, tienes el mismo programa de antes sin indentar. ¿A que ya no es tan agradable de leer?
Sobre todo, las delimitaciones de los bloques, son más difíciles de identificar. Este programa tiene 4 bloques, pero, ¿y si tuviera 200?
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 7;
4
int resultado = 10 + numero1;
5
if (resultado > 15){
6
System.out.println("El resultado de la suma es: " + resultado);
7
}
8
for (int x = 0; x <= 10; x++) {
9
System.out.println("El valor es " + x);
10
}
11
}
12
}
Java
1
public class Main {
2
}
¿Le añades un método o más de uno? Pues estos, al estar un nivel por debajo en la jerarquía de bloques que he explicado antes, tendrán una indentación. Cada
muñeca matrioska que pongas dentro de otra, deberá ir con una indentación.
Y fíjate en los cierres de bloque. El primero, el de la clase, se cierra sin indentar, a la misma altura que empezamos a escribirla.
El método, al llevar una indentación, debe llevarla también en su llave de cierre. Así se ve fácil, ¿verdad?
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 7;
4
int resultado = 10 + numero1;
5
}
6
}
Por último, tenemos los otros dos bloques. Estos están dos niveles por debajo del bloque de clase en la jerarquía y uno frente al método. Por lo tanto, deberán llevar
dos indentaciones. Puesto que son del mismo nivel jerárquico, van indentados al mismo nivel.
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 7;
4
int resultado = 10 + numero1;
5
if (resultado > 15){
6
System.out.println("El resultado de la suma es: " + resultado);
7
}
8
for (int x = 0; x <= 10; x++) {
9
System.out.println("El valor es " + x);
10
}
11
}
12
}
Después, tenemos cosas como los condicionales o bucles anidados, que añaden más bloques de estos tipos dentro de ellos mismos, pero esto ya es un tema para
ver en otro capítulo. No quiero avasallarte con más cosas.
Piensa que si te dejas una llave sin poner, el programa no se va a ejecutar, así que cuando te ocurra un error por llave, revisa los cierres y aperturas de cada bloque.
Ejercicios de Java
Te dejo un par de ejercicios relacionados con el temario. Las soluciones, las encontrarás en el siguiente capítulo.
1. ¿Sabrías ordenar este código correctamente? Puedes editarlo directamente aquí, ya que si lo copias en IntelliJ IDEA u otro IDE, puede que te haga el
ejercicio automáticamente (piensa que si recargas la página, se pierde lo que edites aquí).
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 7;
4
int resultado = 10 + numero1;
5
if (resultado > 15){
6
System.out.println("El resultado de la suma es: " + resultado);
7
}
8
for (int x = 0; x <= 10; x++) {
9
System.out.println("El valor es " + x);
10
}
11
}
12
}
Java
1
public class Main
2
public static void main(String[] args)
3
byte numero1 = 10
4
byte numero2 = 20
5
boolean comparacion = numero1 != numero2
6
System.out.print(comparacion)
Flujo de ejecución normal en programas Java
Hablé brevemente sobre el flujo de ejecución normal, de un programa java, en el capítulo 2. Por si no lo recuerdas, el flujo de ejecución, es el orden en que se
ejecutan cada una de las líneas de código de un programa.
En Java, empieza en la columna 1, línea 1. Va leyendo toda la línea y al final, pasa a la siguiente.
Sin embargo, gracias a las estructuras de control de flujo, como son los condicionales, podemos alterar esta normalidad y hacer que el programa vaya tomando
formas y caminos distintos.
Declaraciones de selección
En ocasiones, verás a las estructuras condicionales, denominarlas como estructuras o declaraciones de selección.
En Java, tenemos dos tipos de declaraciones de selección if (la que veremos en este capítulo) y switch.
Verás que aunque su mecanismo de decisión gira en torno a un valor booleano (decisiones mediante verdadero o falso), se pueden hacer infinidad de cosas y que
los necesitarás constantemente.
El condicional IF de Java
Empecemos con algo muy sencillo, un programa que va a tener un condicional if, para que veas de una vez por todas, como hacer que tu programa tome decisiones
booleanas para unas veces ejecutar cierto código y otras otro código diferente.
El condicional if, lleva una expresión o condición como las que vimos en el capítulo 7 con los operadores de comparación. Si esta expresión devuelve true (es
verdadera) se ejecutará el bloque de código que le pongamos al if. En cambio, si devuelve false, no se ejecutará nada de ese bloque. Será ignorado y continuará
con normalidad en la siguiente línea de código del programa.
En el condicional if, se evalúa si el valor de numero1 es menor que el de numero2. Esto es cierto. Esta expresión booleana devuelve true. Por lo tanto, se ejecuta el
bloque de código envuelto entre las llaves del if.
El código solo es una línea con un print(), pero podría ser mucho más código.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
if (numero1 < numero2) {
10
System.out.print("Esto es verdadero.");
11
}
12
}
13
}
Resultado en la consola
Esto es verdadero.
En el caso de que la expresión del if no se cumpla, no se va a ejecutar el bloque de código, por lo que, en este caso, no devolvería nada en la consola.
Fíjate en la expresión. Esta vez he puesto que numero1 es mayor que numero2. Esto es false.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
if (numero1 > numero2) {
10
System.out.print("Esto es verdadero.");
11
}
12
}
13
}
Pese a que el bloque de código del if no se ejecute cuando devuelve false, el resto de líneas inferiores, siguen ejecutándose con normalidad en el flujo de ejecución
del programa:
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
if (numero1 > numero2) {
10
System.out.print("Esto es verdadero.");
11
}
12
13
System.out.print("Este texto está fuera del if y se ejecuta siempre.");
14
}
15
}
Resultado en la consola
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
if (numero1 > numero2) {
10
System.out.println("Esto es verdadero.");
11
}
12
13
System.out.print("Este texto está fuera del if y se ejecuta siempre.");
14
}
15
}
Resultado en la consola
Esto es verdadero.
Este texto está fuera del if y se ejecuta siempre.
Básicamente, ambos métodos hacen lo mismo. Sacar algo en la consola. La diferencia fundamental reside en la forma en que lo hacen.
println() hace una nueva línea cada vez que se utiliza. Hace lo que se conoce en informática como salto de línea (equivalente a pulsar la tecla ENTER en un editor
de texto).
Aunque en el código tenemos tres líneas de texto individuales, estas salen todas juntas sin saltos de línea al final.
Java
1
System.out.print("Línea de texto 1.");
2
System.out.print("Línea de texto 2.");
3
System.out.print("Línea de texto 3.");
Resultado en la consola
Java
1
System.out.println("Línea de texto 1.");
2
System.out.println("Línea de texto 2.");
3
System.out.println("Línea de texto 3.");
Resultado en la consola
Línea de texto 1.
Línea de texto 2.
Línea de texto 3.
Si te cuesta acordarte de cuál es cuál, haz una traducción al español. Print en español, es imprimir. Eso es lo que hace, imprimir (que en programación se refiere a
mostrar algo en pantalla).
Por otro lado, println viene de print line (imprimir línea en español).
Espero que de alguna forma, te sea fácil recordar estos dos nombres.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
if (numero1 < numero2) {
10
System.out.println("La expresión se cumple (true)");
11
} else {
12
System.out.println("La expresión no se cumple (false)");
13
}
14
}
15
}
Resultado en la consola
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
if (numero1 == numero2) {
10
System.out.println("La expresión se cumple (true)");
11
} else {
12
System.out.println("La expresión no se cumple (false)");
13
}
14
}
15
}
En este caso, puesto que es falsa, ya no se ejecuta el código del bloque if como ocurría antes, pero ahora, tenemos una alternativa para el programa, que es el
código del bloque else.
Resultado en la consola
Por cierto, fíjate en la línea 11 del código, donde está declarado el bloque else. Este no lleva condición, está sujeto siempre a que la que lleva el if devuelva false.
Por la forma de escribirlo, muchas veces, en Java, se escribe al lado de la llave de cierre del bloque if, para que sea más fácil de ver a simple vista, que el bloque
else está ligado al anterior bloque, el del if.
Si escribes esta declaración en otra línea (sin poner otro código por en medio), no pasa nada en cuanto a errores, por convención sí.
Si te preguntas si las convenciones son buenas, la respuesta es que sí. En este universo que es la programación, es muy probable que alguien tenga que editar tu
código. Seguir unas convenciones (reglas) universales en un lenguaje de programación, es la clave para un código limpio y fácil de entender por cualquiera.
Ahora bien, puede que en más de una ocasión, te despistes y utilices convenciones de otros lenguajes donde no toca, no le des una importancia crucial a esto.
Preocúpate primero con aprender a escribir código, ya habrá tiempo de pulir la escritura.
Sobre todo, cuando llevas un tiempo sin tocar mucho un lenguaje de programación, suele pasar que utilizas "costumbres" de otros.
También, si veis que me descuido de algo y sabéis que no está correcto, os invito a que me lo digáis, será de gran ayuda, tanto para mí como para quién esté
estudiando conmigo.
Este siempre está sujeto a un if que es el que lleva la voz cantante (expresión o condición).
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
else {
10
System.out.println("La expresión no se cumple (false)");
11
}
12
}
13
}
Error en la consola
Los diagramas de flujo son útiles para visualizar las posibles salidas que tendrá un programa. Normalmente, cuando vamos a diseñar un programa medianamente
complejo, tendremos que hacer un diagrama de flujo antes de empezar a escribir el código. Esto facilitará enormemente el trabajo a la hora de escribir el código, ya
que tendremos una hoja de ruta detallada de todas nuestras ideas, plasmadas en este esquema.
Primero empieza con una condición, que es la que escribimos al declarar el condicional if. Esta condición solo puede tomar dos caminos, o es verdadera (true) o es
falsa (false).
Como ves en el diagrama, solo se puede ejecutar a la vez uno de los dos bloques. Después de esto, continúa con el resto de líneas de código que encuentre, con
total normalidad.
En los bloques azules, el que tiene el camino (true), es el que corresponde al bloque if. El que tiene false, es el que corresponde al bloque else.
Cada uno puede tener un número "n" de instrucciones, es decir, un número indeterminado de ellas.
Si creías que esto era todo, agárrate, que aún queda la mejor parte.
if, else if, else de Java
En los condicionales if, se pueden emplear más matices de la verdad (varias condiciones), no todo tiene porque ser blanco o negro (true o false).
Podemos especificar más condiciones true aparte de la del bloque if, con el fin de tener más de un posible camino antes de llegar al bloque else.
Esta sería la sintaxis para añadir el bloque nuevo (else if). Si te fijas, tiene su propia condición.
La condición del bloque else if, solo se evalúa si la del bloque if devuelve false.
Si el bloque else if devuelve false también, pasamos como última alternativa al bloque else. Cada uno de estos bloques se va a ejecutar dejando anulados al resto.
Java
1
if (condición) {
2
//bloque de código
3
} else if (condición) {
4
//bloque de código
5
} else {
6
//bloque de código
7
}
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
if (numero1 > numero2) {
10
System.out.println("Se ejecuta el if.");
11
} else if (numero2 == numero3){
12
System.out.println("Se ejecuta el else if.");
13
} else {
14
System.out.println("Se ejecuta el else.");
15
}
16
}
17
}
Resultado en la consola
Se ejecuta el else.
¿Por qué se ejecuta el bloque else?
Si la condición del bloque if else es true, se ejecuta su bloque de código. Se ignora el resto (en el ejemplo, el bloque else).
En el caso de que este bloque devuelva false, se ignora y pasamos a otro bloque else if (si lo hubiera). Puesto que no hay nada más, pasamos a ejecutar el bloque
else, este, como ya sabes, no se evalúa, es por si todo da false.
Este nuevo tipo de bloque es mucho más fácil de entender de lo que parece. Veamos unos ejemplos.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
if (numero1 > numero2) {
10
System.out.println("Se ejecuta el if.");
11
} else if (numero2 > numero3){
12
System.out.println("Se ejecuta el else if.");
13
} else {
14
System.out.println("Se ejecuta el else.");
15
}
16
}
17
}
Resultado en la consola
En el siguiente ejemplo, la condición del if, es verdadera, ya que numero1 tiene el mismo valor que numero3. Sin embargo, el bloque else if, tiene una condición
también verdadera. Entonces, ¿cuál se ejecutará?
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
if (numero1 == numero3) {
10
System.out.println("Se ejecuta el if.");
11
} else if (numero2 > numero3){
12
System.out.println("Se ejecuta el else if.");
13
} else {
14
System.out.println("Se ejecuta el else.");
15
}
16
}
17
}
La respuesta es el primer bloque que devuelva true. En este caso, el primero que encuentra Java es el del if. El resto es ignorado, aunque devuelvan un valor true.
Primero, llegamos a la condición del if. Si esta da true, se ejecuta su código y de ahí, pasamos al resto del programa.
Si la condición del if es false, se evalúa el bloque else if. Si su condición es true, se ejecuta su bloque de código y de ahí pasamos al resto del programa.
Si la condición del else if también es false, llegamos al bloque else, el cual, no tiene expresión. Se ejecutará su código y pasaremos al resto del programa.
Múltiples bloques else if
Una de las ventajas de los bloques else if, es que puedes colocar los que quieras, no tiene porque ser uno solo.
Estos bloques funcionan igual, se irán evaluando en caso de que el anterior devuelva false.
En este caso, el bloque if da false. Pasamos al primer else if. Este da false. Pasamos al siguiente. Así hasta que alguno de true, como es el caso del tercer else if.
Si nada se cumple, pasamos como siempre en última instancia a ejecutar el bloque else.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
if (numero1 > numero3) {
10
System.out.println("Se ejecuta el if.");
11
} else if (numero2 < numero3){
12
System.out.println("Se ejecuta el primer else if.");
13
} else if (numero1 > 50){
14
System.out.println("Se ejecuta el segundo else if.");
15
} else if (numero2 == 15){
16
System.out.println("Se ejecuta el tercer else if.");
17
} else {
18
System.out.println("Se ejecuta el else.");
19
}
20
}
21
}
Resultado en la consola
• El bloque else, depende de que haya siempre, al menos, un bloque if, es "expresión" dependiente (chiste barato de mi cosecha).
• Puedes colocar 0 o más bloques else if en un conjunto if.
• Los bloques else if se escriben siempre después de un bloque if y antes del bloque else, es decir, entre ellos.
• El bloque else if, depende del bloque if, aunque tenga expresión propia, no se admite esto en Java. Esto devolverá el siguiente error:
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
} else if (numero2 < numero3){
10
System.out.println("Se ejecuta el primer else if.");
11
} else if (numero1 > 50){
12
System.out.println("Se ejecuta el segundo else if.");
13
} else if (numero2 == 15){
14
System.out.println("Se ejecuta el tercer else if.");
15
} else {
16
System.out.println("Se ejecuta el else.");
17
}
18
}
19
}
Error en la consola
Dejamos este kilométrico capítulo con unos ejercicios para que practiques un poco lo aprendido.
Ejercicios de Java
Te dejo unos ejercicios relacionados con el temario. Las soluciones, las encontrarás en el siguiente capítulo.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
} else if (numero2 < numero3){
10
System.out.println("Se ejecuta el primer else if.");
11
} else if (numero1 > 50){
12
System.out.println("Se ejecuta el segundo else if.");
13
} else if (numero2 == 15){
14
System.out.println("Se ejecuta el tercer else if.");
15
} else {
16
System.out.println("Se ejecuta el else.");
17
}
18
}
19
}
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
}
7
}
3. Sin ejecutar este código. ¿Sabrías decir qué bloque del condicional se va a ejecutar?
Java
1
public class Main {
2
public static void main(String[] args) {
3
//condicional if
4
if (10 > 5) {
5
System.out.println("Se ejecuta el if.");
6
} else if (5 < 10) {
7
System.out.println("Se ejecuta el primer else if.");
8
} else if (10 == 10){
9
System.out.println("Se ejecuta el segundo else if.");
10
} else if (5 != 5){
11
System.out.println("Se ejecuta el tercer else if.");
12
} else {
13
System.out.println("Se ejecuta el else.");
14
}
15
}
16
}
1. En este ejercicio, tenías que ordenar el código con las indentaciones correctas.
Java
1
public class Main {
2
public static void main(String[] args) {
3
int numero1 = 7;
4
int resultado = 10 + numero1;
5
if (resultado > 15){
6
System.out.println("El resultado de la suma es: " + resultado);
7
}
8
for (int x = 0; x <= 10; x++) {
9
System.out.println("El valor es " + x);
10
}
11
}
12
}
2. Aquí solo tenías que añadir algunos puntos y coma y llaves faltantes en el código.
Java
1
public class Main {
2
public static void main(String[] args) {
3
byte numero1 = 10;
4
byte numero2 = 20;
5
boolean comparacion = numero1 != numero2;
6
System.out.print(comparacion);
7
}
8
}
El siguiente pseudocódigo muestra una expresión en la parte de declaración del switch. Después, tendremos una serie de "case" con un valor asociado.
Java
1
switch (expresión) {
2
case valor1:
3
// instrucciones de código
4
break;
5
case valor2:
6
// instrucciones de código
7
break;
8
9
...
10
11
case valor_n:
12
// instrucciones de código
13
break;
14
default:
15
// instrucciones de código
16
}
17
Después, empieza la declaración del condicional switch en la línea 7. Esta declaración, no necesita de una expresión comparativa realmente. Le paso el valor de
error (200) y a partir de este, buscará una coincidencia en cada uno de los "case".
En este caso, el "case 200", es el que coincide con el valor pasado, por lo tanto, se ejecuta su bloque de código. El resto se ignora.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int error = 200;
5
6
//condicional switch
7
switch (error) {
8
case 200:
9
System.out.println("Todo ok.");
10
break;
11
case 301:
12
System.out.println("Movimiento permanente de la página.");
13
break;
14
case 302:
15
System.out.println("Movimiento temporal de la página.");
16
break;
17
case 404:
18
System.out.println("Página no encontrada.");
19
break;
20
case 500:
21
System.out.println("Error interno del servidor.");
22
break;
23
case 503:
24
System.out.println("Servicio no disponible.");
25
break;
26
default:
27
System.out.println("Código de error no disponible.");
28
}
29
}
30
}
Para evaluar, se admiten diferentes tipos de datos, pero no en el mismo switch. Es decir, por ejemplo, en el siguiente código, tenemos una variable de tipo short.
Todos los "case" son válidos para un contenedor de este tipo, sin embargo, el case con valor 301000, no es válido para un tipo short y por lo tanto, no puede
funcionar.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
short error = 200;
5
6
//condicional switch
7
switch (error) {
8
case 200:
9
System.out.println("Todo ok.");
10
break;
11
case 301000:
12
System.out.println("Movimiento permanente de la página.");
13
break;
14
case 302:
15
System.out.println("Movimiento temporal de la página.");
16
break;
17
case 404:
18
System.out.println("Página no encontrada.");
19
break;
20
case 500:
21
System.out.println("Error interno del servidor.");
22
break;
23
case 503:
24
System.out.println("Servicio no disponible.");
25
break;
26
default:
27
System.out.println("Código de error no disponible.");
28
}
29
}
30
}
Error en la consola
Por si no te has fijado, en realidad, todo el conjunto de switch, es un único bloque, fíjate que a diferencia de if else, que cada cosa tenía sus propias llaves, en switch,
esto no pasa.
Es por este motivo, que para poder funcionar correctamente, requiere del uso de una nueva palabra reservada del lenguaje. "break".
Si no ponemos esta palabra al terminar cada "case", lo que va a ocurrir, es que se ejecutará todo en bloque, independientemente de si se cumple un "case", o no.
Aquí puedes ver lo que ocurriría sin utilizar "break".
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int error = 200;
5
6
//condicional switch
7
switch (error) {
8
case 200:
9
System.out.println("Todo ok.");
10
case 301:
11
System.out.println("Movimiento permanente de la página.");
12
case 302:
13
System.out.println("Movimiento temporal de la página.");
14
case 404:
15
System.out.println("Página no encontrada.");
16
case 500:
17
System.out.println("Error interno del servidor.");
18
case 503:
19
System.out.println("Servicio no disponible.");
20
default:
21
System.out.println("Código de error no disponible.");
22
}
23
}
24
}
El resultado es la ejecución de todas las instrucciones como si estuvieran fuera de un switch. Por lo que sin break, no podemos utilizar switch.
Resultado en la consola
Todo ok.
Movimiento permanente de la página.
Movimiento temporal de la página.
Página no encontrada.
Error interno del servidor.
Servicio no disponible.
Código de error no disponible.
Volvamos a dejar el código como estaba al principio. ¿Y si tenemos este valor en la variable?
Java
1
int error = 500;
En este caso, evalúa el "case 200", este no coincide con el valor 500. Ignora todo este código. Evalúa el siguiente case (301). Este valor tampoco concuerda.
Pues bien, se van evaluando e ignorando todos los selectores hasta llegar a una coincidencia. Esta se ejecuta y finalmente, se ignoran el resto de líneas gracias al
break.
Resultado en la consola
Nos queda ver un apartado más, "default". Esta sección del switch, solo se va a ejecutar en caso de que no haya ninguna coincidencia con los "case".
Java
1
int error = 700;
Resultado en la consola
Java
1
default:
2
System.out.println("Código de error no disponible.");
3
break;
Java
1
switch (error) {
2
case 200:
3
System.out.println("Todo ok.");
4
break;
5
case 200:
6
System.out.println("Todo ok.");
7
break;
8
}
Error en la consola
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int error = 700;
5
6
//condicional switch
7
switch (error) {
8
case 200:
9
System.out.println("Todo ok.");
10
break;
11
case 301:
12
System.out.println("Movimiento permanente de la página.");
13
break;
14
case 302:
15
System.out.println("Movimiento temporal de la página.");
16
break;
17
case 404:
18
System.out.println("Página no encontrada.");
19
break;
20
case 500:
21
System.out.println("Error interno del servidor.");
22
break;
23
case 503:
24
System.out.println("Servicio no disponible.");
25
break;
26
}
27
}
28
}
La respuesta es que no, pero en caso de que no haya coincidencias con los "case", no se ejecutará nada del switch.
Código switch:
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int error = 200;
5
6
//condicional switch
7
switch (error) {
8
case 200:
9
System.out.println("Todo ok.");
10
case 301:
11
System.out.println("Movimiento permanente de la página.");
12
case 302:
13
System.out.println("Movimiento temporal de la página.");
14
case 404:
15
System.out.println("Página no encontrada.");
16
case 500:
17
System.out.println("Error interno del servidor.");
18
case 503:
19
System.out.println("Servicio no disponible.");
20
default:
21
System.out.println("Código de error no disponible.");
22
}
23
}
24
}
Código if else:
Java
1
public static void main(String[] args) {
2
//variables del programa
3
int error = 200;
4
5
//condicional if
6
if (error == 200) {
7
System.out.println("Todo ok.");
8
} else if (error == 301) {
9
System.out.println("Movimiento permanente de la página.");
10
} else if (error == 302) {
11
System.out.println("Movimiento temporal de la página.");
12
} else if (error == 404) {
13
System.out.println("Página no encontrada.");
14
} else if (error == 500) {
15
System.out.println("Error interno del servidor.");
16
} else if (error == 503) {
17
System.out.println("Servicio no disponible.");
18
} else {
19
System.out.println("Código de error no disponible.");
20
}
21
}
22
}
Como puedes ver, no hay mucha diferencia de líneas de código escritas, pero la gran diferencia, es que en el condicional if, tenemos que poner cada vez una
expresión como (error == valor), en el switch, en cada case, hacemos esta comparación, pero no la tenemos que escribir.
El bloque if, es el equivalente al primer case del switch. Los else if, lo son al resto de case. Finalmente, el equivalente a else, es default en el switch.
Ejercicios de Java
Te dejo unos ejercicios relacionados con el temario. Las soluciones, las encontrarás en el siguiente capítulo.
6
//condicional switch
7
switch error {
8
case 200
9
System.out.println("Todo ok.");
10
case 301
11
System.out.println("Movimiento permanente de la página.");
12
case 302
13
System.out.println("Movimiento temporal de la página.");
14
case 404
15
System.out.println("Página no encontrada.");
16
case 500
17
System.out.println("Error interno del servidor.")
18
case 503
19
System.out.println("Servicio no disponible.");
20
default
21
System.out.println("Código de error no disponible.");
22
}
23
}
24
}
2. Escribe un condicional switch para evaluar los días de la semana mediante una variable o constante numérica (lunes, podría ser 1, martes 2…). Cada día,
tendrá su propio case. En cada case, basta con que pongas un print(). Además, quiero que pongas un print() alternativo en el caso de que el valor de la
variable con el día de la semana, no sea un valor del 1 al 7.
1. En este condicional if, faltaba el bloque obligatorio if. La expresión que hayas utilizo en dicho bloque, no es relevante para la solución. Con que ejecute y
funcione como se espera, ya has superado el ejercicio.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
int numero3 = 10;
7
8
//condicional if
9
if (numero1 > numero2) {
10
System.out.println("Se ejecuta el if.");
11
} else if (numero2 < numero3) {
12
System.out.println("Se ejecuta el primer else if.");
13
} else if (numero1 > 50) {
14
System.out.println("Se ejecuta el segundo else if.");
15
} else if (numero2 == 15) {
16
System.out.println("Se ejecuta el tercer else if.");
17
} else {
18
System.out.println("Se ejecuta el else.");
19
}
20
}
21
}
2. Aquí basta con poner solo el bloque if con esta expresión. No se pedía más.
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
int numero1 = 10;
5
int numero2 = 15;
6
7
//condicional if
8
if (numero1 != numero2) {
9
System.out.println("Se ejecuta el if.");
10
}
11
}
12
}
¿Qué es un bucle en programación?
Los bucles son estructuras de control de flujo, como los condicionales. Con la gran diferencia, que estos están diseñados para repetir bloques de código mientras se
cumpla cierta condición.
En Java contamos con más de un tipo de bucle, sin embargo, en este capítulo, solo hablaré del bucle while.
Java
1
iterador;
2
3
while (condición) {
4
//Bloque de código
5
incremento/decremento;
6
}
Te dejo aquí un ejemplo sencillo de bucle while con todos sus elementos:
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle while
4
int i = 0; //iterador
5
6
while (i < 10) {
7
System.out.println("El valor es: " + i);
8
i++; //incremento
9
}
10
}
11
}
Resultado en la consola
El valor es: 0
El valor es: 1
El valor es: 2
El valor es: 3
El valor es: 4
El valor es: 5
El valor es: 6
El valor es: 7
El valor es: 8
El valor es: 9
Analicemos lo que ocurre aquí.
El bucle necesita una variable de control (iterador) para funcionar. Por convención y para que sea fácil de identificar, se suele poner "i" como nombre identificador.
Aunque puede que en ciertas ocasiones, lo veas también con "n".
Esto son solo convenciones, puedes darle un nombre de identificador cualquiera. Eso si, que sea válido según las normas de nomenclatura de Java.
Esta variable está inicializada en 0. No obstante, puede ser cualquier valor numérico, no importa que sea un 0.
En la expresión del while, lo que he puesto es que el bucle se ejecute mientras el valor de "i" sea menor que 10.
Puesto que 0 es menor que 10, esto se cumple. La expresión devuelve "true". Por este motivo, al igual que ocurre con el condicional if, si devuelve "true" la
expresión, se ejecuta el bloque de código de la estructura.
Si esto fuese un condicional if, se imprimiría el texto del print() con "El valor es: 0" y nada más, ahí termina la cosa.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle while
4
int i = 0; //iterador
5
6
if (i < 10) {
7
System.out.println("El valor es: " + i);
8
}
9
}
10
}
Resultado en la consola
El valor es: 0
No obstante, los bucles se repiten siempre si la expresión sigue siendo verdadera.
Si quitamos la parte del incremento (la última línea del bucle), verás que el bucle da un valor de 0 infinitamente (no ejecutes este código, puede dejar colgado tu
equipo).
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle while
4
int i = 0; //iterador
5
6
while (i < 10) {
7
System.out.println("El valor es: " + i);
8
}
9
}
10
}
Resultado en la consola
El valor es: 0
El valor es: 0
El valor es: 0
El valor es: 0
… INFINITO
Puesto que "i" siempre vale 0, se cumple siempre la condición de "i < 10". Por lo tanto, si queremos implementar un mecanismo para que el bucle no se repita
infinitamente, sino que cumpla su función y luego finalice, vamos a utilizar incrementos y decrementos.
Los bucles infinitos, como estos, muchas veces surgen por errores de lógica, aunque habrá ocasiones, en las que necesitemos bucles infinitos a propósito. Todo
depende de lo que queramos hacer.
El operador aritmético de incremento ("++") incrementa el valor de una variable en 1 cuando es ejecutado.
El operador aritmético de decremento ("--") decrementa el valor de una variable en 1 cuando es ejecutado.
Java
1
//--> Bucle while
2
3
int i = 0; //iterador
4
5
while (i < 10) {
6
System.out.println("El valor es: " + i);
7
i++;
8
}
A las ejecuciones de los bucles, se les llama frecuentemente como iteraciones. Cada vez que se repite su bloque de código, es una iteración.
• Iteración 1:
• Inicialmente, "i" vale 0.
• Se lee la condición del while. Esta devuelve "true".
• Se imprime en la consola "El valor es: 0".
• Finalmente, se incrementa el valor de "i" en 1.
• Iteración 2:
• Inicialmente, "i" vale 1.
• Se lee la condición del while. Esta devuelve "true".
• Se imprime en la consola "El valor es: 1".
• Finalmente, se incrementa el valor de "i" en 1.
• Iteración 3:
• Inicialmente, "i" vale 2.
• Se lee la condición del while. Esta devuelve "true".
• Se imprime en la consola "El valor es: 2".
• Finalmente, se incrementa el valor de "i" en 1.
• ... (omito escribir todas las iteraciones para no repetirme tanto).
• Iteración 10:
• Inicialmente, "i" vale 9.
• Se lee la condición del while. Esta devuelve "true".
• Se imprime en la consola "El valor es: 9".
• Finalmente, se incrementa el valor de "i" en 1.
• Iteración 11:
• Inicialmente, "i" vale 10.
• Se lee la condición del while. Esta devuelve "false" (10 no es menor que 10).
• Al devolver "false", no se ejecuta nada más del bucle. Ha finalizado.
6
while (i > 0) {
7
System.out.println("El valor es: " + i);
8
i--;
9
}
10
}
11
}
Resultado en la consola
El valor es: 10
El valor es: 9
El valor es: 8
El valor es: 7
El valor es: 6
El valor es: 5
El valor es: 4
El valor es: 3
El valor es: 2
El valor es: 1
Esta vez, el valor de "i" inicialmente es 10. La expresión es que se ejecute mientras "i" sea mayor que 0. Cada iteración del bucle, se va restando o decrementando
el valor de "i". En el momento en el que vale 0, el bucle while recibe un "false" en su condición. Ahí termina.
Algo importante a tener en cuenta, es el orden en el flujo de ejecución del incremento y el decremento. Te dejo un ejemplo:
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle while
4
int i = 0; //iterador
5
6
while (i < 10) {
7
i++;
8
System.out.println("El valor es: " + i);
9
}
10
}
11
}
Resultado en la consola
El valor es: 1
El valor es: 2
El valor es: 3
El valor es: 4
El valor es: 5
El valor es: 6
El valor es: 7
El valor es: 8
El valor es: 9
El valor es: 10
Antes, este mismo bucle, imprimía desde el valor 0 hasta el 9 (10 iteraciones) y ahora, lo hace desde el 1 hasta el 10 (10 iteraciones).
Esto está pasando, porque he invertido el flujo de ejecución dentro del bloque de código del while.
• Iteración 1:
• Inicialmente, "i" vale 0.
• La condición del while es "true".
• Se incrementa el valor de "i" en 1.
• Al imprimir, "i" vale 1. Se ha incrementado antes de imprimir.
Simplemente, mientras vaya devolviendo "true", se irán repitiendo las instrucciones del bloque de código. En cuanto devuelve "false", se deja de ejecutar.
Dejamos aquí el bucle while. Lo seguiremos utilizando en más ocasiones y verás usos más prácticos que estos.
Ejercicios de Java
Te dejo unos ejercicios relacionados con el temario. Las soluciones, las encontrarás en el siguiente capítulo.
Java
1
while (i > 10) {
2
System.out.println("El valor es: " + i);
3
}
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle while
4
int i = 1; //iterador
5
6
while (i > 5) {
7
System.out.println("El valor es: " + i);
8
i++;
9
}
10
}
11
}
• Se ejecuta 5 veces.
• Se ejecuta 4 veces.
• No se ejecuta.
• Es infinito.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle while
4
int i = 1; //iterador
5
6
while (i < 5) {
7
System.out.println("El valor es: " + i);
8
i++;
9
}
10
}
11
}
• Se ejecuta 5 veces.
• Se ejecuta 4 veces.
• No se ejecuta.
• Es infinito.
6
while (i < 5) {
7
System.out.println("El valor es: " + i);
8
}
9
}
10
}
• Se ejecuta 5 veces.
• Se ejecuta 4 veces.
• No se ejecuta.
• Es infinito.
6
//condicional switch
7
switch (error) {
8
case 200:
9
System.out.println("Todo ok.");
10
break;
11
case 301:
12
System.out.println("Movimiento permanente de la página.");
13
break;
14
case 302:
15
System.out.println("Movimiento temporal de la página.");
16
break;
17
case 404:
18
System.out.println("Página no encontrada.");
19
break;
20
case 500:
21
System.out.println("Error interno del servidor.");
22
break;
23
case 503:
24
System.out.println("Servicio no disponible.");
25
break;
26
default:
27
System.out.println("Código de error no disponible.");
28
}
29
}
30
}
2. Esta sería una posible solución. He decidido utilizar una constante en lugar de una variable, puesto que los días de la semana, son siempre 7, va a ser un
valor que no va a cambiar nunca. Por lo tanto, puede ser un buen sitio para utilizar una constante.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
final int SEMANA = 5;
5
6
//condicional switch
7
switch (SEMANA) {
8
case 1:
9
System.out.println("Es lunes.");
10
break;
11
case 2:
12
System.out.println("Es martes.");
13
break;
14
case 3:
15
System.out.println("Es miércoles.");
16
break;
17
case 4:
18
System.out.println("Es jueves.");
19
break;
20
case 5:
21
System.out.println("Es viernes.");
22
break;
23
case 6:
24
System.out.println("Es sábado.");
25
break;
26
case 7:
27
System.out.println("Es domingo.");
28
break;
29
default:
30
System.out.println("Día de la semana inválido.");
31
}
32
}
33
}
Diferencia entre el bucle while y do while de Java
La diferencia entre estos dos bucles está en que el bucle do while, siempre se va a ejecutar al menos una vez. Este comportamiento no ocurre con el bucle while, ya
que si desde un principio, su expresión es false, no se ejecuta ni una sola vez.
Java
1
do {
2
//Código del bucle
3
} while (condición);
El bucle do while empieza con la palabra reservada do. Con ello, empieza un bloque de código. En dicho bloque, colocaremos todo el código del bucle, incremento o
decremento incluido.
Finalmente, cuando acabemos de escribir todo el código, debemos utilizar la palabra while junto con la expresión. Esto se finaliza con un punto y coma.
Con estas dos palabras, se puede formar una frase "do this while" (haz esto mientras).
Por lo tanto, con "do", le indicamos a Java, "haz" lo que te indico en este código.
Después de hacerlo, comprueba la expresión, el "mientras". Así pues, este es el motivo de que se ejecute al menos una vez, independientemente de que se cumpla
la expresión del while o no, porque se ejecuta el código primero y consulta la expresión después según el flujo de ejecución.
6
while (i < 10) {
7
System.out.println("El valor es: " + i);
8
i++; //incremento
9
}
10
}
11
}
En este caso, puesto que la variable "i" vale 15 inicialmente, nunca se cumple la condición del bucle (i menor que 10).
En cambio, si usamos un bucle do while, aunque la condición evalúa como false desde un principio, se ejecuta una vez. Esa es la característica especial del bucle
do while.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle do while
4
int i = 15; //iterador
5
6
do {
7
System.out.println("El valor es: " + i);
8
i++; //incremento
9
} while (i < 10); // expresión
10
}
11
}
Resultado en la consola
El valor es: 15
En el caso de que un bucle do while evalúe su expresión como true desde el principio, se va a ejecutar con total normalidad, como si fuera un bucle while normal.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle do while
4
int i = 5; //iterador
5
6
do {
7
System.out.println("El valor es: " + i);
8
i++; //incremento
9
} while (i < 10); // expresión
10
}
11
}
Resultado en la consola
El valor es: 5
El valor es: 6
El valor es: 7
El valor es: 8
El valor es: 9
Ejercicios de Java
Te dejo unos ejercicios para que practiques con el bucle do while de Java. Las soluciones las encontrarás en el siguiente capítulo del curso.
1. Elige la opción correcta sobre el siguiente código (la idea es que no ejecutes nada hasta elegir una opción).
• Se imprime "El valor es: 0".
• No se imprime nada.
• Se imprime del "El valor es: ", del 0 al 9.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle do while
4
int i = 0; //iterador
5
6
do {
7
System.out.println("El valor es: " + i);
8
i++; //incremento
9
} while (i > 10); // expresión
10
}
11
}
Resultado en la consola
El valor es: -1
El valor es: -2
El valor es: -3
El valor es: -4
El valor es: -5
Java
1
do {
2
System.out.println("El valor es: " + i);
3
i++
4
} while (i > 10) }
Java
1
while (i > 10) {
2
System.out.println("El valor es: " + i);
3
}
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle while
4
int i = 100; //iterador
5
6
while (i < 126) {
7
System.out.println("El valor es: " + i);
8
i++;
9
}
10
}
11
}
Sintaxis del bucle for de Java
En el bucle for contamos con todo lo que el bucle while, con la diferencia de que en el for lo tenemos todo concentrado en la zona de paréntesis.
Java
1
for (inicializador; condición de salida; iteración) {
2
//bloque de código
3
}
El iterador también llamado inicializador, lo declaramos directamente sobre la declaración del bucle for. Además, le indicamos después una expresión de salida, la
cual, determina cuando finalizará el bucle. Por último, hay que indicar un incremento o decremento, con el fin de no crear un bucle infinito.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle for
4
for (int i = 0; i < 5; i++) {
5
System.out.println("El valor es " + i);
6
}
7
}
8
}
Resultado en la consola
El valor es 0
El valor es 1
El valor es 2
El valor es 3
El valor es 4
No hay gran cosa que detallar con este bucle por el momento. Seguiremos avanzando en el curso con nuevos temas e iremos utilizando los bucles con ejemplos
mucho más prácticos que este.
A partir del siguiente capítulo empezamos ya con la programación orientada a objetos, un tema que hay que aprender ya, puesto que es la base fundamental de
Java.
Ejercicios de Java
Te dejo un par de ejercicios para que practiques con el bucle for de Java. Las soluciones las encontrarás en el siguiente capítulo del curso.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle for
4
for (int i = 0, i < 7, i++) {
5
System.out.println("El valor es " + i);
6
}
7
}
8
}
2. ¿Crees que este código va a funcionar? Lo digo porque es un bucle for y tiene el incremento en el bloque de código como si fuera un while.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle for
4
for (int i = 0; i < 5;) {
5
System.out.println("El valor es " + i);
6
i++;
7
}
8
}
9
}
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle do while
4
int i = -1; //iterador
5
6
do {
7
System.out.println("El valor es: " + i);
8
i--; //decremento
9
} while (i > -6); // expresión
10
}
11
}
Java
1
do {
2
System.out.println("El valor es: " + i);
3
i++;
4
} while (i > 10);
En este caso, no vamos a imprimir en la consola el valor, sino que lo obtenemos en el programa, para después usarlo en algo.
La clase SumaNumeros, tiene un método para sumar dos valores de tipo int.
Entonces, en la clase Main, creo un objeto de tipo SumaNumeros para poder usar su método suma.
Con este objeto, utilizo la llamada al método con los valores 10 y 7. El println() que tiene el método en la línea 5, hace que el valor 17 se imprima en la consola (u
otro valor si le pasamos otros números).
Java
1
class SumaNumeros {
2
int resultado;
3
// Método de suma con dos valores
4
public void suma(int a, int b) {
5
resultado = a + b; // Se realiza el cálculo
6
System.out.println(resultado); // Se imprime el resultado
7
}
8
}
9
10
class Main {
11
public static void main(String[] args) {
12
// Objeto de tipo SumaNumeros
13
SumaNumeros suma1 = new SumaNumeros();
14
// Llamada al método suma con dos números
15
suma1.suma(10, 7);
16
}
17
}
Una cosa que podríamos hacer para guardar el valor en el programa, es almacenar la llamada del método suma en una variable:
Java
1
class Main {
2
public static void main(String[] args) {
3
// Objeto de tipo suma
4
SumaNumeros suma1 = new SumaNumeros();
5
// Llamada al método suma con dos números
6
int resultado = suma1.suma(10, 7);
7
// Hacemos una nueva suma con el valor obtenido de la anterior
8
suma1.suma(resultado, 10);
9
}
10
}
Y de nuevo, error:
Error en la consola
Java
1
public void suma(int a, int b) { }
Ahora explicaré la palabra void.
En estos casos, debemos quitar la palabra void y poner el tipo de dato que esperamos que devuelva la llamada al método. Además, reemplazaremos el println() que
es un elemento de salida que no conserva el dato dentro del programa y en su lugar, dejaremos un return, que devolverá el resultado al hacer la llamada.
Java
1
class SumaNumeros {
2
// Método de suma con dos valores
3
public int suma(int a, int b) {
4
int resultado = a + b; // Se realiza el cálculo
5
return resultado; // Se devuelve el resultado
6
}
7
}
8
9
class Main {
10
public static void main(String[] args) {
11
// Objeto de tipo suma
12
SumaNumeros suma1 = new SumaNumeros();
13
// Llamada al método suma con dos números
14
int resultado = suma1.suma(10, 7);
15
// Imprimimos el resultado
16
System.out.println(resultado);
17
// Hacemos una nueva suma con el valor obtenido de la anterior
18
resultado = suma1.suma(resultado, 10);
19
// Imprimimos el nuevo resultado
20
System.out.println(resultado);
21
}
22
}
Si utilizas IntelliJ IDEA, verás que aparece un warning:
Warning
Local variable 'resultado' is redundant
Este warning dice que la variable local 'resultado' es redundante, es decir, que sobra.
Java
1
class SumaNumeros {
2
// Método de suma con dos valores
3
public int suma(int a, int b) {
4
return a + b; // Se devuelve el resultado
5
}
6
}
¿Qué es void?
La palabra reservada void de Java, se utiliza para indicar que un método no tiene return (valor de retorno).
Este método es un ejemplo de ello. Como no necesitamos reutilizar el resultado del println(), lo podemos dejar como void y sin return, para que no devuelva nada,
solo que haga lo que tiene que hacer, que en este caso, es imprimir en la consola.
Java
1
class Usuario {
2
public void saludo() {
3
System.out.println("¡Hola!");
4
}
5
}
¿Qué es un array?
Un array, también conocido como arreglo, es una estructura de datos que puede almacenar una colección de elementos del mismo tipo. En Java, los arrays tienen
un tamaño fijo que se define en el momento de su creación. Cada elemento del array se puede acceder mediante un índice numérico que representa su posición en
el array. Ahora veamos cómo crearlos y manipularlos.
Java
1
int[] numeros = new int[4];
Este código crea un array de enteros (int) llamado "numeros" con un tamaño de 4 elementos. Puedes cambiar el tipo del array por cualquier otro tipo de dato, como
String, double o boolean, según lo necesites.
Este array está vacío, es como una variable normal, pero con cuatro espacios. Para rellenarlos, hay que asignarle datos a cada parte del contenedor.
Para asignar valores, tienes que utilizar el índice de los arrays. Funciona igual que el de los String. Se cuenta desde la posición 0 hasta la que tenga el array. En
este caso, tiene cuatro espacios y, por lo tanto, el índice va del 0 al 3 (4 valores en total).
Java
1
int[] numeros = new int[4];
2
numeros[0] = 10;
3
numeros[1] = 20;
4
numeros[2] = 30;
5
numeros[3] = 40;
Así, la posición 0 del array tiene el valor 10, la 1, 20, la 2, 30 y la 3, 40.
Después de almacenar valores, llega el momento de utilizarlos. Para usar uno de estos cuatro valores, lo haremos llamando al array y la posición que queramos:
Python
1
int[] numeros = new int[4];
2
numeros[0] = 10;
3
numeros[1] = 20;
4
numeros[2] = 30;
5
numeros[3] = 40;
6
7
System.out.print("El valor de la primera posición del array es: " + numeros[0] + ".");
Resultado en la consola
También puedes inicializar un array con valores específicos en el momento de su creación. Por ejemplo:
Java
1
int[] numeros = {10, 20, 30, 40};
De esta forma, no hay que indicar la longitud, ya que los propios elementos la especifican. Si hay cuatro elementos, el array toma una longitud de índice de 4.
Para reasignar valores a los array en Java, solo tienes que utilizar la misma técnica que usas con las variables normales, solo que en este caso, debes especificar
que parte del array quieres modificar. Por ejemplo, vamos a cambiar el valor de la última posición:
Java
1
int[] numeros = {10, 20, 30, 40};
2
System.out.println("El valor de la última posición del array es: " + numeros[3] + ".");
3
4
numeros[3] = 4000;
5
System.out.println("El valor de la última posición del array es: " + numeros[3] + ".");
Como podemos comprobar, los valores se reasignan correctamente.
Resultado en la consola
Se puede automatizar el acceso a todas las partes de un array con un bucle. En esta ocasión, voy a utilizar el bucle for.
Java
1
int[] numeros = {10, 20, 30, 40};
2
3
for (int i = 0; i < numeros.length; i++) {
4
System.out.println("El valor es: " + numeros[i] + ".");
5
}
De valor en el iterador le doy un 0 y le digo que este valor aumente de uno en uno hasta la longitud total del array (length). El iterador se lo paso como posición en la
llamada del array. Así, cada ciclo del bucle, va cambiando, 0, 1, 2 y 3.
Resultado en la consola
Sin embargo, desde hace ya bastante tiempo, se añadió una herramienta muy especial para este tipo de tareas tan frecuentes. Se trata del bucle for-each o
enhanced loop.
Java
1
int[] numeros = {10, 20, 30, 40};
2
3
for (int i : numeros) {
4
System.out.println("El valor es: " + i + ".");
5
}
El resultado es el mismo, y Java lo entiende correctamente. Solo hay que darle un nombre al iterador, dos puntos y el nombre del array que se quiere iterar de arriba
a abajo. No hay que usar ni length ni incrementos. Es más cómo, limpio y fácil de escribir.
Ordenación de arrays
Otra de las típicas tareas con un array, es ordenarlos.
Ordenar arrays en orden ascendente
Primero, importa la clase Arrays del paquete java.util, necesitaremos utilizar su método sort().
Java
1
import java.util.Arrays;
El siguiente array, tiene los valores desordenados. Quiero que a la hora de imprimirlos, estén bien ordenados en orden ascendente, de menor a mayor.
Java
1
int[] numeros = {105, 7, 156, 40};
Si lo imprimimos así, efectivamente, se iteran los valores en el orden en el que se encuentran escritos.
Java
1
int[] numeros = {105, 7, 156, 40};
2
Arrays.sort(numeros);
3
4
for (int i : numeros) {
5
System.out.println("El valor es: " + i + ".");
6
}
Resultado en la consola
El valor es: 7.
El valor es: 40.
El valor es: 105.
El valor es: 156.
Hay diversas formas de ordenar un array en orden descendente. Una de ellas, es utilizar la clase Collections en el sort(). Sin embargo, tiene un poco de
complicación. No entraré todavía en detalles con estas cosas, pero lo voy a explicar un poco.
Primero, añade la importación de la clase Collections de java.util:
Java
1
import java.util.Collections;
Ahora, utiliza dentro del sort() un segundo argumento, la llamada al método reverseOrder() de la clase Collections.
Java
1
Integer [] numeros = {105, 7, 156, 40};
2
Arrays.sort(numeros, Collections.reverseOrder());
3
4
for (int i : numeros) {
5
System.out.println("El valor es: " + i + ".");
6
}
La declaración del array "int" deberá ser "Integer" para poder funcionar con Collections.
La explicación es un poco complicada y no creo conveniente explicarla todavía. Te diré la parte corta y simplificada.
Collections.reverseOrder() necesita un objeto para trabajar. Los valores int son valores primitivos. En cambio, los valores Integer son objetos que representan
valores primitivos.
Resultado en la consola
Le decimos como primer argumento el nombre del array. Como segundo, el valor que queremos buscar.
Java
1
int[] numeros = {1, 2, 3, 4};
2
3
int indice = Arrays.binarySearch(numeros, 3);
4
5
System.out.println("El elemento 3 está en la posición " + indice + " del índice.");
Resultado en la consola
Es obligatorio que este bloque venga siempre o bien con un bloque catch o con un finally.
El try lo que hace es intentar ejecutar el código con normalidad. Si algo dentro de este código suelta una excepción, lo podremos manejar con un bloque catch.
Java
1
try {
2
// Código que podría generar una excepción
3
}
Si el código del try no lanza una excepción, se va a ejecutar con total normalidad y se ignorará el código alternativo expuesto en el bloque catch.
El bloque catch de Java
El bloque catch, entonces, se emplea para dar una posible solución a una excepción ocurrida en un bloque try.
Java
1
try {
2
// Código que podría generar una excepción
3
} catch (tipoExcepción nombreVariable) {
4
// Código que se ejecutará si se produce una excepción del tipo especificado
5
}
Veamos algún ejemplo práctico con estos dos bloques.
El siguiente código se utiliza para leer un archivo de texto plano con Java. El código es correcto, pero como se trata de una excepción comprobada, el compilador
nos obliga a manejar la excepción por si el archivo no existe, tiene otro nombre o no se puede abrir por algún motivo.
Java
1
import java.io.*;
2
3
public class Main {
4
public static void main(String[] args) {
5
FileReader archivo = new FileReader("./src/archivo.txt");
6
}
7
}
Al ejecutar esto sin manejar, nos da el siguiente error:
Error
Java
1
import java.io.*;
2
3
public class Main {
4
public static void main(String[] args) {
5
try {
6
FileReader archivo = new FileReader("./src/archivo.txt");
7
System.out.println("Se leyó el archivo.");
8
} catch (Exception e) {
9
System.out.println("No se pudo abrir el archivo.");
10
}
11
}
12
}
En el try ponemos la parte que puede provocar esa excepción y en catch, un código que se ejecutará solo en caso de que falle el código del try.
La ruta del archivo apunta a la raíz del proyecto, así que si tienes ahí un archivo llamado "archivo.txt" en "src". Lo leerá. No hará nada con él, ya que solo estamos
intentando leerlo con Java, no imprimir lo que contiene ni modificarlo. Eso sí, al menos veremos el println() que he puesto para saber que lo ha leído.
Por lo tanto, si ejecutas y no sale ningún error en la consola, es que se ha ejecutado el código del try sin problemas.
Ahora, voy a poner mal el nombre del archivo y ruta, para que no lo encuentre:
Java
1
FileReader archivo = new FileReader("noexiste.txt");
Resultado
Aunque verás más adelante que las excepciones, es mejor manejarlas de manera concreta para cada tipo de fallo. Veremos algún ejemplo en otro capítulo. De
momento, con Exception en el catch, estamos indicando que se manejen de la misma forma todas las posibles excepciones que ocurran. Eso, normalmente, no es lo
mejor, ya que es más apropiado dar soluciones concisas y dedicadas a cada tipo de problema que pueda surgir.
Java
1
import java.io.*;
2
3
public class Main {
4
public static void main(String[] args) {
5
try {
6
FileReader archivo = new FileReader("./src/archivo.txt");
7
System.out.println("Se leyó el archivo.");
8
} catch (Exception e) {
9
System.out.println("No se pudo abrir el archivo.");
10
} finally {
11
System.out.println("Independientemente de como le haya ido con el archivo, espero que tenga un buen día :D");
12
}
13
}
14
}
Esta vez, la ruta es correcta, por lo que se ejecuta el bloque try y luego el finally:
Resultado
Se leyó el archivo.
Independientemente de como le haya ido con el archivo, espero que tenga un buen día
Resultado