Punto y coma al final de la declaración "si"
Hoy, después de media hora de buscar un error, descubrí que es posible poner un punto y coma después de una declaración if en lugar de código, así:
if(a == b);
// Do stuff
Lo que básicamente significa que las cosas se harán, sean a
iguales b
o no, y la if
declaración no tiene ningún sentido. ¿Por qué Java no me da un error? ¿Existe alguna situación en la que esto sería útil?
¿Por que sucede?
La especificación del lenguaje Java dice que:
La declaración vacía
Una declaración vacía no hace nada.
EmptyStatement: ;
La ejecución de una declaración vacía siempre se completa normalmente
Básicamente significa que desea ejecutar una declaración vacía si a==b
if(a == b);
¿Qué deberías hacer?
Hay dos soluciones principales a este problema:
Puede evitar problemas con declaraciones vacías utilizando el formateador de código y el contenido circundante dentro
if
con{
y}
. Al hacer esto, su declaración vacía será mucho más legible.if(a == b){ ; }
También puede consultar las herramientas utilizadas para el análisis de código estático como:
- encontrar errores
- Estilo de cuadros
- pmd
Pueden resaltar instantáneamente problemas como este.
Recomendaría combinar ambas soluciones.
¿Existe alguna situación en la que esto sería útil?
¿Útil? ¿Como en "hace que su código sea más limpio, más claro, más rápido y más fácil de mantener"? De nada. Lo más probable es que se trate de un código deficiente y confuso .
Pero no es necesariamente benigno . Dicha declaración puede realizar acciones y/o alterar el estado debido a métodos que causan efectos secundarios y, opcionalmente, evaluar esos métodos debido a un cortocircuito de los operadores .
if( a() && b() );
Aquí, a()
o b()
puede hacer algo y b()
solo se ejecutará si a()
es verdadero.
En cuanto a por qué , creo que la respuesta es simplemente que sería peor desviarse del comportamiento esperado definido (por ejemplo, declaraciones como while(reader.read());
) que la alternativa de que los desarrolladores escriban código incorrecto.
Siempre es posible escribir código incorrecto. Y solo para reiterar, este sería un código incorrecto en casi cualquier caso.