2012-10-07 13 views
12

Hice un error de codificación mientras trabajaba en una aplicación, era una prueba de referencia nula. Me tomó horas descubrir cuál era el problema, pero lo que no entiendo es por qué el código se comportó de esta manera.¿Por qué falla la instrucción java if cuando termina en punto y coma?

String name = null; 
String value = null; 

if(name != null && value != null); 
{ 
    System.out.println("Values not null"); 
} 

la sentencia if terminó con ;, que fue mi error y la Values not null se imprimió incluso cuando es obvio que ambos valores son nulos. ¿Alguien puede explicar por qué?

Respuesta

14

Este punto y coma termina una declaración (una vacía), por lo que su código es traducida por el compilador a algo como esto:

if(name != null && value != null) 
{ 
    //nothing here 
} 
{ 
    System.out.println("Values not null"); 
} 

En en otras palabras, si la expresión if es true, ejecuta un bloque de código vacío. Entonces, independientemente de si if era verdadero o no, el tiempo de ejecución procede y ejecuta el bloque que contiene System.out. La declaración vacía sigue siendo una declaración, por lo que el compilador acepta su código.

Otro lugar donde tal error puede ocurrir:

for(int i = 0; i < 10; ++i); 
{ 
    System.out.println("Y U always run once?"); 
} 

o incluso peor (bucle infinito):

boolean stop = false; 
while(!stop); 
{ 
    //... 
    stop = true; 
} 

Me tomó horas para descubrir lo que el problema

El IDE bueno debería advertirle de inmediato sobre tal afirmación, ya que probablemente nunca sea c orrect (como if(x = 7) en algunos idiomas).

+0

i utilizado netbeans pero no me lo advertí. –

+0

@UchennaNwanyanwu: ¿alguien puede probar en Eclipse? Sólo curiosidad ... –

+0

@TomaszNurkiewicz .. Un IDE no le advertirá sobre esto .. No se considera uso incorrecto de si ... –

2
if(name != null && value != null); 
{ 
    System.out.println("Values not null"); 
} 

es equivalente a:

if(name != null && value != null){} 

{ 
    System.out.println("Values not null"); 
} 
2
if(name != null && value != null); 

Aquí su sentencia if quedó terminada debido al punto y coma ...

lo tanto, es igual que un empty si el bloque: -

if(name != null && value != null) {} 

Así que el siguiente código se convierte en una bloque inicializador: -

{ 
    System.out.println("Values not null"); 
} 

Como es un bloque de inicializador .. Se ejecutará siempre sin importar cuál sea su condición if evaluada para ...

1

Son las reglas de la gramática estándar.Punto y coma terminan declaraciones, pero las declaraciones pueden estar vacías, por lo que estas líneas:

if (...); 
{ 
} 

son equivalentes a:

if (...) /* do nothing */ ; 

{ 
    ... 
} 

El { ... } instrucción que sigue sólo se parece a cualquier otro bloque de código, y siempre será ejecutado, porque la declaración if ya está hecha para entonces.

1

Su código es equivalente a:

if(name != null && value != null) { 
    // empty code block 
} 

System.out.println("Values not null"); 
5

; termina el comunicado.

if(name != null && value != null); 

es equivalente a:

if(name != null && value != null) 
{ 
} 

Y el código siguiente es simplemente un bloque de código.

1

El punto y coma finaliza la instrucción, y por lo tanto separa el si del siguiente bloque.

Tenga en cuenta que los bloques pueden ser arbitrarios.

{ 
System.out.println("This is some code"); 
} 

if(true); Esto es válido, y no hace nada. El lenguaje que permite esto es bastante estúpido, aunque los IDE deberían detectar estos problemas con advertencias y cosas por el estilo.

0

One bare ; es una declaración completamente vacía. Después de, si tiene que haber exactamente una declaración que se ejecutará cuando if sea verdadero. La única declaración que se ejecuta en su caso es la declaración vacía. Puede combinar más declaraciones a una con {statement; statement;...}

0

Comprenda que las declaraciones condicionales no siempre tienen que seguir con las llaves de apertura y cierre. La mayoría de los idiomas le permitirán simplemente emitir llaves si solo desea ejecutar una sola declaración cuando se cumplan los términos de la condición.

lo que significa que la siguiente es completamente válido, por ejemplo:

if (var1 == true && var2 == true) var3 = 'both true'; 
{ 
    //block here, this is always executed regardless of the statements outcome 
} 

En esencia, el código hace exactamente esto. Excepto que su declaración individual se determina que es ; (sí, esto se considera una declaración).

Lo que escriba es lo mismo que:

if(name != null && value != null) { 
    // do nothing 
} 

System.out.println("Values not null"); 
Cuestiones relacionadas