Identación y llaves: ¿cómo y cuando usarlas?
El uso de la sangría o identación y de las llaves generalmente se les complica a los aprendices de programación. Pero su uso es sumamente importante, ya que pueden determinar si tu programa se ejecute de manera correcta o no.
¿Para qué sirven las llaves?
Las símbolos { } se utilizan en el lenguaje Java para agrupar un conjunto de instrucciones.
Las llaves forman bloques de código. Su uso es más común en las estructuras de control de flujo. Pero en general sirven para agrupar bloques de instrucciones por niveles. Estos niveles pueden ser:
- El nivel más superior que tendremos en Java, la clase,
- El nivel de agrupación generado por los métodos,
- Y el nivel más interno compuesto por las estructuras de control de flujo.
En la figura 1 muestro los niveles de bloques de programa que se forman al abrir y cerrar las llaves. De acuerdo a esta figura, puedes notar que:
- El nivel indicado con el número 1 y encerrado en el rectángulo rojo es el nivel superior, y la llave en la línea: public class EjCondicional1a { indica que se inicia el bloque de la clase llamada EjCondicional1a. Este nivel es el nivel de clase.
- El nivel indicado con el número 2 y encerrado en el rectángulo verde es el siguiente nivel, e inicia con la llave en la línea public static void main(String[] args) throws IOException {. Este nivel es el nivel de métodos, específicamente en este caso, es el nivel del método main, e indica todas las instrucciones que se ejecutan en método principal de la clase.
- El nivel más inferior (o más interno) está indicado con el número 3, y encerrado en rectángulos azules. Coloqué 2 rectángulos del mismo color en lugar de dos de diferente color, porque se trata que una única estructura. La estructura completa es if-else, y cada par de llave marcada con el número 3 abre y cierra su correspondiente rama verdadera y falsa, pero sigue perteneciendo a UNA SOLA estructura de control. Este es el nivel de estructuras de control de flujo.
Cuando usar llaves.
Entonces, se usan llaves para:
- Señalar el inicio y fin de una clase.
- Agrupar el código que pertenece a un método.
- Establecer el inicio y fin de las acciones que se ejecutarán dentro de una estructura de control de flujo.
En la figura 2 te vuelvo a mostrar otro ejemplo con este concepto de la creación de bloques de código cada vez que se insertan llaves. De esta manera, entonces, no se insertan llaves sólo porque sí, porque tu maestr@ de programación te dice, o porque sino las colocas Netbeans te marca error. Recuerda: se insertan llaves cuando sea necesario agrupar líneas de código.
¿Y si no se insertan las llaves?
Como ya se mencionó, las llaves agrupan bloques de código, y si no se insertan lo más común es que te genere un error de sintaxis por la falta de ellas.
Lo que pasa si se olvidan las llaves a nivel de clase o método.
En el caso de las llaves de nivel de clase o de método, quizá no te resulte tan difícil detectar este error y corregirlo. Para muestra de ello, observa las figuras 3 y 4 en las que se observa el mensaje de error que Netbeans genera cuando las llaves de cierre de la clase o del método no se cierran (fig 3) o cuando la llave de inicio de la clase no se ha abierto (4).
Lo que pasa si se olvidan las llaves en alguna estructura de control.
Uno de los errores de sintaxis más difíciles de detectar es cuando olvidas agrupar bloques de código que pertenecen a estructuras de control de flujo. Este tipo de errores pueden modificarte la lógica de control del programa. Y a la larga, generar un resultado que no esperas.
Ejemplo # 1: En la estructura if-else
En primer lugar, sino se colocan llaves en estructuras de control compuestas (como la if-else), te va a generar un error de sintaxis. (Observa la figura 5).
El mensaje de error aparece en el else (la rama falsa) y su mensaje no te dice que el error es el no abrir las llaves. Más bien, el error literalmente te indica “else sin if”; pues al no abrir las llaves después de la condición del if (línea 30), sólo reconoce como la única línea a ejecutar si la condición es verdadera a la línea 31, esto es, el mensaje que imprime “Estás contratado, Felicidades”.
La línea 32, el mensaje “Pasa a Recursos Humanos a dejar tus documentos” no se considera como una acción que deba realizarse si y sólo si la condición es verdadera, sino que se realizará en todos los casos y sin depender del resultado de la condicional. Esto convierte a la estructura en una condicional simple. ¿Ahora puedes entender el mensaje de error? Es obvio que si la estructura if ya terminó con la acción en línea 31, entonces ese else ya no debe existir. Claro que nosotros sabemos que el error recae en el hecho de que no fueron agrupadas las líneas 31 y 32.
Ejemplo # 2: En la estructura for.
Ahora observa el código de la figura 6. El uso de las llaves para agrupar las líneas 42 y 43 permite que estas líneas se repitan cuando x tome valores de -5 a 10. Esto implica que cada valor calculado de y se estará mostrando en la pantalla.

Figura 6. Llaves agrupando las acciones de un ciclo for.
Su contraparte, la figura 7, no cuenta con llaves que agrupen estas acciones. Esto genera que se calcula el valor de y para cada valor de x , pero sólo se imprime el último valor calculado de y. En tanto que el último valor de x es el valor requerido para salir del ciclo, en este caso, 11. Este tipo de situaciones pueden confundir a un programador poco experimentando al ver la salida “y = 18, x=11” , para c = 2.

Figura 7. El mismo ciclo for sin llaves
Simplemente recuerda: cuenta el número de acciones que se deben realizar en cada rama de una estructura if. Si el número de acciones son más de 1, DEBEN ser agrupadas usando llaves.
La importancia de la identación
Para hablar sobre la sangría, considera el siguiente fragmento de código:

Figura 8: Ejemplo de código
La pregunta importante aquí es: ¿Cuántas acciones se deben ejecutar si la expresión condicional es verdadera? Para contestar a esta pregunta, observa que:
- NO existe rama else.
- No hay llave abierta después de la expresión condicional (if)
Imagina que x=-8. Evalúa la expresión condicional para que sepas cuál será el resultado:
x > 0 && x % 2 == 0
Sustituyendo el valor de x:
-8 > 0 && -8%2==0
Y comenzamos a evaluar la expresión: considerando que -8 NO ES MAYOR QUE 0, el resultado de la expresión condicional claramente es false, debido a que se tiene un operador &&. (Recuerda que en el operador AND, las dos expresiones condicionales deben ser verdaderas, y la primera expresión resultó falsa)
¿Ya sabes cuántas acciones se van a realizar si la expresión condicional es verdadera?
La respuesta correcta es 1: sólo se va a ejecutar la instrucción: x = 0; y el nivel de sangría nos ayudan a identificar que sólo x=0 pertenece a la rama verdadera de la condicional. Sin embargo debido a que la expresión condicional es FALSA, ésta acción no se ejecutará.
Ahora bien, la que sí se debe ejecutar SIEMPRE, sin importar si la condicional es verdadera o no, es la instrucción: x = 1; por lo tanto la salida impresa es 1. En ausencia de llaves la sangría nos indica las acciones que se deben ejecutar sin depender del resultado de la condicional, colocando estas acciones al mismo nivel del programa principal.
¿Cuál sería la salida si x = 12?
3 Respuestas
[…] También observa cómo el uso de la sangría es relevante. No tanto para el compilador, sino más bien para el programador, pues nos permite escribir de una forma más legible los programas, lo que los hará también más fáciles de leer y entender. (Conoce más sobre el uso de la sangría en esta entrada) […]
[…] un buen hábito, hacer el algoritmo legible y también para escribir de esta forma el programa. (Aquí puedes leer un poco más sobre el uso de la […]
[…] Si la condición es verdadera, se dice que el flujo del programa entra al cuerpo del ciclo, y por lo tanto se puede ejecutar la Acción1. En la práctica, el cuerpo del ciclo puede estar conformado por más de una instrucción, pero para simplificar, he escrito solo la palabra Acción1. Recuerda que si el cuerpo sólo se compone de una acción, no requiere ser encerrado entre llaves, pero si el cuerpo tiene dos o más acciones, requiere las {}. (Este asunto puedes consultarlo aquí) […]