2012-07-17 42 views
9

Estoy escribiendo una aplicación para Android que hace un montón de cosas. Recientemente modifiqué mi código para tener una mejor estructura, pero de repente me aparece un problema muy extraño.IF instrucción simplemente no está funcionando

handleRequest(String str) 
{ 
    boolean foo = executeCommand(str); 
    this.publishProgress("FOO1: " + foo); 

    if (foo == false); 
    { 
     this.publishProgress("FOO2: " + foo); 
     sendString("Failed to execute: " + str); 
    } 

    this.publishProgress("FOO3: " + foo); 
    sendEOM(); 
} 

El código anterior debe ejecutar un comando y almacenar 'foo' con si el comando se ejecutó correctamente. Este código está dentro de una AsyncTask de Android (hilo) así que uso 'publishProgress' para mostrar un brindis.

He estado hojeando el depurador y ¡FOO es cierto! Los brindis muestran que FOO también es cierto durante todo el camino. Sin embargo, sigue adelante y salta dentro del bloque IF y lo ejecuta también. Nunca había visto esto antes, creo que es un problema con Java. Estaba pisando la función 'executeCommand' y parece que también está salteando declaraciones de retorno.

He ejecutado el código en un dispositivo virtual y uno real y ambos lo hacen.

¿Alguna idea? Estoy completamente perdido aquí.

+0

quite el punto y coma después de la sentencia if –

+1

No es su problema, pero más limpio y más claro a usar 'if (! Foo)' en lugar. – dimo414

+0

@ dimo414 Bien, estaba frustrado cuando publiqué esto, así que lo cambié a "FOO == FALSE" solo para que fuera tan explícito que no pude haber visto nada malo. – yellow

Respuesta

22

Dijiste

if (foo == false); 

quite el punto y coma, debe ser

if (foo == false) {//your code} 
+2

Oh hombre, me siento como un idiota. No puedo creer perdí ese punto y coma allí! Pasé mucho tiempo depurando 'executeCommand' pensando que el problema estaba allí ... De todos modos, ¡gracias por detectar eso para mí! – yellow

9

Retire el punto y coma: if (foo == false); ->if (foo == false)

9

Se pone un punto y coma después de if comunicado.

De esta manera, su declaración if está ahí sola, y el siguiente bloque de código siempre se está ejecutando.

modificar el código de la siguiente manera:

handleRequest(String str) { 
    boolean foo = executeCommand(str); 
    this.publishProgress("FOO1: " + foo); 

    if (foo == false) { 
     this.publishProgress("FOO2: " + foo); 
     sendString("Failed to execute: " + str); 
    } 

    this.publishProgress("FOO3: " + foo); 
    sendEOM(); 
} 

N. B.
Mantener sus llaves de apertura de bloque en la misma línea que la definición de función/condición de bucle hace que estos tipos de errores sean mucho menos frecuentes, IMO.

4

No habrá ";" punto y coma después de la declaración if.

Así que en lugar de si (foo == false); que debería ser si (foo == false){}

1

No sé cómo esta línea compila if (foo == false);, pero es evidente que lo hace. Debe eliminar el punto y coma al final de la línea, como han mencionado otros. Con el ; allí significa no hacer nada si foo es falso. Luego el programa entra en el siguiente bloque entre las dos llaves. Necesita instalar findbugs o PMD para advertir contra este tipo de errores tipográficos.

2

Si escribe el punto y coma (;) después de la instrucción if, termina allí la condición if. que necesita para iniciar un bloque de código después de escribir si la condición es decir

if(foo == false){ 

// block of Code 

} //end of if condition 
Cuestiones relacionadas