0% encontró este documento útil (0 votos)
7 vistas114 páginas

JavaCompleto (Apoyo)

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
7 vistas114 páginas

JavaCompleto (Apoyo)

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 114

¿Qué son las variables?

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.

Tal y como su nombre indica, las variables son susceptibles a variar.

¿Qué son los tipos de datos?


En java, al crear contenedores o variables, tendremos que especificar de qué tipo de dato es cada una.

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.

En este capítulo, no verás los tipos que hay, será en el siguiente.

¿Cómo se crea una variable en Java?


Las variables en Java, se dividen en cuatro partes:

• 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.

Finalmente, la parte del valor, es la información que guarda la variable.

De estas cuatro partes, lo único que va a poder cambiar durante el programa, es la parte del valor.

Declarar, inicializar, reasignar y llamar a una variable


Antes de crear tu primera variable, debes tener estos conceptos claros.

Declarar una variable en Java

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.

Inicializar una variable en Java

Inicializar una variable, es la acción de darle un valor inicial a una variable.


Java
1
byte numero1;
2
numero1 = 100;
En este caso, he inicializado la variable en otra línea. También se puede declarar una variable y darle un valor inicial todo a la vez en la misma línea.

Java
1
byte numero1 = 100;

Reasignar un valor a una variable de Java

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;

Llamar a una variable en Java

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;

Tipos de datos primitivos en Java


En este capítulo, te voy a mostrar solo los tipos de datos primitivos de Java, que son 8. El resto los veremos en otra ocasión.

El espacio en memoria RAM de las variables


En el capítulo anterior hablé sobre lo que eran las variables y que había de diferentes tipos. Cada uno de estos tipos, aparte de almacenar datos diferentes, ocupan
un espacio diferente en la memoria RAM del equipo en el que se ejecutan. Es por este motivo, que para optimizar al máximo tus programas, tendrás que elegir bien
el tipo de dato más adecuado en cada ocasión, de forma, que no ocupe una cantidad desmesurada de memoria, pero que funcione como toca.

Los tipos de datos numéricos de Java

En Java, casi todos los tipos primitivos, son para almacenar (guardar) números.

Tipos de datos numéricos enteros en Java

En Java disponemos de cuatro tipos de datos numéricos enteros:


El tipo de dato Byte de Java

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.

¿Cuánto es un byte en informática?

Para que empieces a entender estos espacios en memoria, es importante que sepas que es un byte.

Un byte es una medida de almacenamiento informático, estos bytes equivalen a 8 bits.

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.

Por cierto, este número, debe lleva el sufijo L tras el número.

Java
1
long numero1 = 9223372036854775807L;

El tipo de dato primitivo float de Java

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;

El tipo de dato primitivo double de Java


El tipo de dato primitivo double de Java, sirve para almacenar valores decimales de hasta 15 dígitos. Por lo tanto, permiten mayor precisión. No obstante, ocupa en
memoria como un long de los tipos enteros, 8 bytes.

Java
1
double pi = 3.141592653589793;

Otros tipos de datos primitivos de Java


El tipo de dato primitivo Char

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 type de dato primitivo boolean

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í.

Ejercicios de Java para practicar


Te pongo unos pocos ejercicios para que practiques un poco la teórica. Debajo de estos, tienes las soluciones del capítulo anterior.

¿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.

Soluciones de los ejercicios del capítulo anterior

• 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
}

Operación de suma en Java


Podemos en un print(), realizar una operación aritmética y sacar el resultado en la consola. No necesitamos ni variables.

Para realizar una suma en Java, utilizaremos el símbolo "+".

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

Operaciones aritméticas con variables


Esto de realizar operaciones aritméticas directamente sobre la consola, está muy bien, pero no sirve de mucho, ya que simplemente obtenemos un resultado y no
podemos hacer nada con él. Para eso, utilizamos mejor una calculadora normal y corriente y ya está.

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".

Operación de resta en Java


La operación de resta, funciona igual que la suma, solo tienes que utilizar el operador "-" en lugar de "+".

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.

Si lo pones al revés, el resultado es positivo:

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

Operación de división en Java


Las operaciones de división en Java, las haremos con el operador "/".

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
}

Soluciones de los ejercicios del capítulo anterior

• 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:

Recuerda, no olvidarte la F en los tipos de datos float.

Java
1
final float numero = 300.56F;

¿Para qué sirven los valores booleanos en programación?


Los valores booleanos (tipo de dato boolean en Java), sirven para que los programas sean capaces de tomar decisiones lógicas. Estas decisiones se tomarán con
valores booleanos, "true" y "false".

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").

¿Dónde utilizaremos los operadores de comparación?


Normalmente, los operadores de comparación, los usaremos con condicionales. Tema del cual hablaremos muy pronto. De momento, los vamos a emplear con
variables de tipo boolean, así las empiezas a utilizar y aprendes la lógica de las decisiones booleanas, la cual, te allanará el terreno enormemente para cuando
demos el tema de los condicionales.

¿Cuáles son los operadores de comparación?


Te dejo una tabla con los operadores de comparación. Los cuales, los vamos a poner en práctica a continuación.
Símbolo de operador Nombre del operador

> Mayor que

< Menor que

>= Mayor o igual que

<= Menor o igual que

== Igual que

!= Diferente que

¿Cómo funcionan las comparaciones?


Las comparaciones que hace Java para determinar si algo se cumple o no, son muy simples. Mira este ejemplo:

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 de comparación mayor que de Java


Empecemos a poner todo esto en práctica.

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.

El operador de comparación mayor o igual que de Java


El operador mayor o igual que de Java, compara si un valor es mayor o es igual que el otro. En ambas ocasiones, si es así, devolverá true. Solo en caso de que sea
menor, devolverá false.

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.

Si ponemos los dos valores iguales o el valor de numero1 mayor, 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

El operador de comparación menor o igual que de Java


El operador de comparación menor o igual que de Java, devuelve "true" si el valor de la izquierda (numero1) es menor o igual que el de la derecha (numero2).

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

El operador de comparación igual que de Java


En esta parte, debes prestar especial atención, ya que muchas veces se confunde el operador de igualdad con el de asignación.

¿Cómo llamas en la vida cotidiana a este símbolo "="? Al menos, yo le llamo igual.

En programación, llamar a esto "=" "igual", es un error y ahora te muestro porque.

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 "=".

El operador de comparación diferente que de Java


El operador de comparación diferente que de Java, nos ofrece la posibilidad de comparar todo lo contrario, al igual que (==). En este caso, si los valores son iguales,
nos devolverá "false" y si son diferentes, "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

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.

¿Qué es un bloque en programación?


Antes de empezar a hablar de condicionales, tengo que explicar que es un bloque, ya que voy a emplear este término para explicar muchas cosas de ahora en
adelante, la primera, serán los condicionales, pero luego vendrán cosas como las clases, los métodos, los bucles, etc.

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
}

¿Qué son las instrucciones en programación?


Para quien empieza en programación, puede que no tenga claro de que hablo cuando digo "instrucción".

Sencillamente, una instrucción, es una orden.

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.

Esto son las instrucciones.

Orden jerárquico de bloques en Java


Lo primero que debes saber para tener claro donde se abre y cierra un determinado tipo de bloque, es saber los tipos que hay y cuáles se escriben dentro de otros.

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
}

¿Cómo sabemos cuantas indentaciones poner?

Es fácil de aprender. Empiezas el primer bloque que es la clase sin indentar:

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.

Acuérdate de esto. Bloque que se abre, bloque que se cierra.

Todo el temario del curso Java aquí.

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
}

2. Pon las llaves y puntos y coma que le correspondan a este 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)
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.

Sintaxis del condicional if de Java


La sintaxis del condicional if en Java, no tiene gran complicación. Declaramos esta estructura mediante la palabra reservada "if", ponemos entre unos paréntesis la
condición que queramos evaluar y entre llaves de apertura y cierre, escribiremos todo el código que se ejecutará solo si se cumple la condición (si es true).
Java
1
if (condición) {
2
//bloque con el código que quieras (se ejecuta solo si la condición es true)
3
}
En el siguiente ejemplo, he creado tres variables, con las que verás el resto de ejemplos de este capítulo.

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

Este texto está fuera del if y se ejecuta siempre.


En caso de que fuera true, se ejecutará el código del bloque if y el resto de líneas igualmente. Funciona independientemente del resto de código 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.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.

Diferencia entre el método print() y println()


Aprovecho para comentarte algo que no había dicho en el curso todavía. Ya que es algo que aparece en el código del if. La diferencia entre print() y println().

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).

En cambio, print() no hace este salto.

Ejemplo con el método print():

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

Línea de texto 1.Línea de texto 2.Línea de texto 3.

Ejemplo con el método println():

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.

El uso de else en Java


Especificar un bloque de código para condiciones true está muy bien, pero… ¿Y si queremos que haya un código alternativo para que se ejecute cuando la
expresión del if es false? Estamos de suerte, ya que gracias al uso de la palabra else, podemos hacer esto mismo.

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

La expresión se cumple (true)


Puesto que numero1 es menor que numero2, se ejecuta el código del bloque if. El del else, es ignorado. Después de eso, continua el flujo de ejecución normal del
programa.

En cambio, mira la siguiente expresión del if, es falsa:

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

La expresión no se cumple (false)


Por si alguien no lo entiende, dejo aquí un resumen:

• Expresión true: se ejecuta el código del if. else descartado.


• Expresión false: se ejecuta el código del else. if descartado.

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í.

¿Es recomendable seguir las convenciones en programación?

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.

Tampoco me hagáis quedar mal T.T, jajaja.

Bloque else sin bloque if


El bloque else, nunca puede ir solo, puesto que no lleva expresión, ¿qué evaluaríamos en él?

Este siempre está sujeto a un if que es el que lleva la voz cantante (expresión o condición).

Si intentas hacer esto, Java te devolverá un 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 {
10
System.out.println("La expresión no se cumple (false)");
11
}
12
}
13
}
Error en la consola

java: 'else' without 'if'


Este error reza, bloque 'else' sin bloque 'if' (lo de bloque lo añado yo para hacer la traducción más "humana").

Diagrama de flujo if else de Java


Y además, por completar, te dejo un diagrama de flujo que te será de utilidad en el futuro para diseñar tus algoritmos antes de plasmarlos en código.

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.

Este diagrama representa un condicional if else cualquiera, no necesariamente el de los ejemplos.

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.

Es posible gracias a los bloques else if.

Sintaxis del condicional if con todos sus bloques

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?

Analicemos como está funcionando esto.

Bloque if devuelve true

Si la expresión del if es true, se ignoran los bloques posteriores.

Bloque if devuelve false


Si la condición del if da false, se ignora y pasa a evaluar el else if.

Bloque if else true

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).

Bloque if else false

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.

Algunos ejemplos más

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

Se ejecuta el else if.


Esta vez, el bloque if da false, y pasamos al bloque else if, el cual, en esta ocasión, devuelve true. El código del else, se ignora.

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.

Diagrama de flujo if, else if, else de Java


Nos queda ver un diagrama más, para que veas como funciona if, else if, else de una forma más visual.

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

Se ejecuta el tercer else if.


Ten en cuenta las siguientes cosas antes de continuar:

• 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

java: illegal start of type


El mensaje de error indica "inicio ilegal de tipo". Cuando veas este error, ya sabes una de las posibles causas.

Dejamos este kilométrico capítulo con unos ejercicios para que practiques un poco lo aprendido.

Todo el temario del curso Java aquí.

Ejercicios de Java
Te dejo unos ejercicios relacionados con el temario. Las soluciones, las encontrarás en el siguiente capítulo.

1. Encuentra los errores en este condicional if y corrígelos.

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
}

2. Crea un condicional if que evalúe si numero1 es diferente a numero2.

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
}

Soluciones de los ejercicios del capítulo anterior

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
}

¿Qué es switch en Java?


"switch" es una estructura condicional como if else, con la gran diferencia, de que en este, solo tenemos una expresión de comparación. En torno a esta, se
evaluarán una serie de selectores de código.

Sintaxis del condicional switch de Java


Comencemos por la sintaxis del condicional switch de Java.

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

Funcionamiento del condicional switch de Java


Veamos esto con un ejemplo práctico con el condicional switch de Java, el cual, te hará entender el funcionamiento de esto.

Partimos de un valor (200) almacenado en la variable "error".

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

incompatible types: possible lossy conversion from int to short


El mensaje principal de error, es "incompatible types", tipos incompatibles.

El uso de break en el condicional switch

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

Error interno del servidor.

El uso de default en el condicional switch

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

Código de error no disponible.


Si te preguntas porque no lleva break, es porque este es el último apartado, al no haber nada después, no hace falta salir del bloque switch, ya que al terminar con la
última instrucción, sale solo.

Por cierto, lo puedes poner, pero es totalmente innecesario.

Java
1
default:
2
System.out.println("Código de error no disponible.");
3
break;

Error por case duplicado


Si pones un case o varios duplicados como en este código, te dará un error.

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: duplicate case label


El error indica que hay una etiqueta case duplicada.

Dejar un switch sin etiqueta default


¿Ocurre algo por dejar sin poner la etiqueta "default"?

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.

Diagrama de flujo switch de Java


Te dejo por aquí un diagrama de flujo de switch para que veas quizás de forma más sencilla, cuales son los posibles caminos que puede tomar este condicional.
switch vs if else en Java
Todavía nos quedan muchas cosas que ver y hacer con switch. Con el fin de no daros demasiada información de golpe del mismo tema y seguir avanzando rápido
con nuevos, dejo el capítulo aquí con una pequeña comparativa entre switch e if else.

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.

¿Cuándo utilizar switch y cuando if else?


La respuesta es fácil, cuando tengas que realizar muchas comparativas repetitivas como la de este capítulo (valor == valor), utiliza switch. En cambio, si tienes
pocas cosas a comparar o son más complejas, usa if else.

Todo el temario del curso Java aquí.

Ejercicios de Java
Te dejo unos ejercicios relacionados con el temario. Las soluciones, las encontrarás en el siguiente capítulo.

1. Encuentra los errores en este condicional switch y corrígelos.


Java
1
public class Main {
2
public static void main(String[] args) {
3
//variables del programa
4
byte 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
}

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.

Soluciones de los ejercicios del capítulo anterior

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.

Sintaxis del bucle while de Java


En principio, la sintaxis recuerda mucho a la del condicional if, sin embargo, hay ciertas diferencias fundamentales.

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.

Incrementos y decrementos en bucles


Los incrementos o decrementos, son mecanismos necesarios a la hora de trabajar con bucles.

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.

Entonces, si dejamos el bucle con el incremento, ocurrirá lo siguiente…

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.

Te dejo también un ejemplo utilizando el decremento, es lo mismo, solo que restando:


Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle while
4
int i = 10; //iterador
5

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.

El orden del incremento y decremento

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.

Diagrama de flujo del bucle while de Java


Finalmente, te dejo el diagrama de flujo del bucle while de Java, para que veas la gran sencillez que alberga en realidad un bucle.

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.

Todo el temario del curso Java aquí.

Ejercicios de Java
Te dejo unos ejercicios relacionados con el temario. Las soluciones, las encontrarás en el siguiente capítulo.

1. Arregla los fallos de este código si los hay.

Java
1
while (i > 10) {
2
System.out.println("El valor es: " + i);
3
}

2. Sin ejecutar este código, ¿Qué respuesta crees que es la correcta?

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.

3. Sin ejecutar este código, ¿Qué respuesta crees que es la correcta?

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.

4. Sin ejecutar este código, ¿Qué respuesta crees que es la correcta?


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
}
9
}
10
}

• Se ejecuta 5 veces.
• Se ejecuta 4 veces.
• No se ejecuta.
• Es infinito.

5. Crea un bucle while con las siguientes características:

• Iterador con un valor inicial de 100.


• Que imprima la frase "El valor del bucle es: 100" hasta llegar a 125. Este último valor, también incluido.

Soluciones de los ejercicios del capítulo anterior

1. Los fallos eran los siguientes:


• El tipo de dato byte, no se correspondía con el valor "200" de la variable "error". Lo puedes cambiar por alguno mayor como short o int.
• La expresión del switch estaba sin los paréntesis.
• A todos los case y default, les faltaban los dos puntos.
• En el case 500, la instrucción que lleva, le falta el punto y coma al final.
• Faltan todos los "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
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.

Sintaxis de un bucle do while de Java


Veamos, antes de pasar a los ejemplos, la sintaxis básica del bucle do while de Java.

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.

Si traducimos la palabra "do" al español, obtenemos un "hacer". De "while", "mientras".

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.

Ejemplo de bucle while vs do while


Veamos un ejemplo de bucle while que nunca se ejecuta.
Java
1
public class Main {
2
public static void main(String[] args) {
3
//--> Bucle while
4
int i = 15; //iterador
5

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

Diagrama de flujo del bucle do while de Java


El diagrama de flujo del bucle do while, varía un poco de el del bucle while.
Todo el temario del curso Java aquí.

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
}

2. Crea un bucle do while que imprima esto en la consola:

Resultado en la consola
El valor es: -1
El valor es: -2
El valor es: -3
El valor es: -4
El valor es: -5

3. Arregla los fallos en este código, si los hay.

Java
1
do {
2
System.out.println("El valor es: " + i);
3
i++
4
} while (i > 10) }

Soluciones de los ejercicios del capítulo anterior

1. El código era correcto, no había nada mal.

Java
1
while (i > 10) {
2
System.out.println("El valor es: " + i);
3
}

2. El código no se ejecuta. La condición del bucle while no se cumple, 1 no es mayor que 5.


3. Se ejecuta 4 veces. Desde "El valor es: 1" hasta "El valor es 4".
4. El bucle es infinito, puesto que le falta el incremento que lo haga terminar.
5. Aquí tienes mi solución:

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
}

Ejemplo de bucle for


Aquí tienes un ejemplo muy simple de bucle for.

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

Diagrama de flujo del bucle for de Java


El diagrama de flujo del bucle for, es exactamente el mismo que el del bucle while. Se comprueba la expresión de salida. Si es true, se ejecuta el bloque de código.
En caso de que sea false, finaliza su ejecución.
Si desde un principio la condición del bucle es false, no se ejecuta ni una sola vez.

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.

Todo el temario del curso Java aquí.

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.

1. Encuentra y soluciona los posibles errores en este código.

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
}

Soluciones de los ejercicios del capítulo anterior

1. La respuesta correcta es la primera. Se imprime "El valor es: 0".


2. Una posible solución es esta de aquí:

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
}

3. Estos eran los fallos que había en el código y la solución corregida.


• Línea 3. Faltaba el punto y coma.
• Línea 4. En lugar de una llave de cierre, había que poner un punto y coma al final de la expresión del while.

Java
1
do {
2
System.out.println("El valor es: " + i);
3
i++;
4
} while (i > 10);

¿Qué es return o los valores de retorno en Java?


Tanto en Java como en la mayoría de lenguajes de programación, la palabra return se usa para devolver un valor desde un método al programa. Por ejemplo,
cuando llamas a un método para que haga algo, puedes utilizar return para decirle que te devuelva el resultado de lo que hizo.

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.

Voy a escribir un ejemplo para que te quede más claro.

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: incompatible types: void cannot be converted to int


El valor que se almacena en resultado, es de tipo void, en lugar de un int (17).

Esto se debe al void que tiene el método suma:

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.

Esta devolución, la capturaremos con una variable.

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.

Podemos realizar la operación directamente sobre un return:

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.

Creación de arrays en Java


Declarar un array en Java

Para declarar un array en Java, debes especificar su tipo y su tamaño:

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.

Índice de los arrays

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.

Acceder a una posición del array

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

El valor de la primera posición del array es: 10.

Declarar e inicializar array en Java

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.

Manipulación de arrays en Java


Reasignar valores a los arrays de Java

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

El valor de la última posición del array es: 40.


El valor de la última posición del array es: 4000.

Iterar arrays en Java


Acceder con bucle for a todos los elementos de un array

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

El valor es: 10.


El valor es: 20.
El valor es: 30.
El valor es: 40.

El bucle for each de Java

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.

Ordenar arrays en orden descendente

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

El valor es: 156.


El valor es: 105.
El valor es: 40.
El valor es: 7.

Buscar elementos en un array de Java


Veamos una última cosa de las infinitas que hay con arrays. La búsqueda de elementos. En concreto, vamos a pasar un valor y Java nos dirá en que posición del
índice del array se encuentra.

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

El elemento 3 está en la posición 2 del índice.


No te pierdas nada del curso Máster en Java.

El bloque try de Java


En Java, el bloque try se utiliza para envolver un conjunto de instrucciones que pueden lanzar una excepción. Esto se usa para controlar los errores y
manejarlos de manera adecuada en tiempo de ejecución.

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.

Esta sería la sintaxis básica:

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: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown


Nos dice precisamente que hay que manejar la excepción FileNotFoundException.

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

No se pudo abrir el archivo.


¡Perfecto! Hemos conseguido manejar la excepción.

¿Qué es mejor? ¿El uso de Exception o excepciones concretas?

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.

El bloque finally de Java


El bloque finally de Java es opcional. Es un bloque adicional que se puede añadir para ejecutar un trozo de código siempre, independientemente de si se
ejecuta el try o se ejecuta el catch.

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

En cambio, si ponemos la ruta mal o el nombre:

Resultado

No se pudo abrir el archivo.


Independientemente de como le haya ido con el archivo, espero que tenga un buen día

También podría gustarte