2010-04-09 10 views
6
boolean r = false ; int s = 0 ; 
while (r == false) ; 
{ 
    s = getInt() ; 
    if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
    else r = true ; 
} 

El texto nunca se muestra aunque se ingrese un 3 o un 123 y el ciclo nunca finaliza. ¿Qué pasa aquí?¿Qué pasa con este ciclo while?

+0

Además, este no es un bucle infinito, por lo que la etiqueta 'infinite-loop' no tiene sentido. –

+3

En realidad, es un ciclo infinito. 'while (r == false);' es un bucle infinito que no hace nada, ya que r se inicializa a falso. –

+7

Deja de intentar poner varias cosas en una línea. Más que nada, esto es lo que causó tu problema. Una vez que tenga el hábito de escribir con claridad, encontrará que este tipo de cosas sucede mucho menos. También configure sus advertencias en eclipse en un nivel superior: debería haberle indicado la declaración vacía. No solo resuelva este problema, solucione las causas raíz. –

Respuesta

32

Tiene un punto y coma después de la condición. Cuando usa llaves para especificar un bloque para su while, no usa un punto y coma.

+2

de hecho. ese es el problema – David

+5

Hehe ... 'while (r == false)/* DO NOTHING * /;' – Armstrongest

9

Eliminar el ';' después de un rato.

8

Otros han señalado el error, pero su código es miedo de otras formas que con el tiempo le tropezar:

if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
else r = true ; 

eso es malo porque se puede intención fácilmente más de una instrucción a ejecutar en el caso de la cláusula if o else. Utilizar llaves y evitar la colocación de las sentencias condicionales en una sola línea:

if (!(s>=0 && s<=2)) 
{ 
    System.out.println ("try again not a valid response"); 
} 
else 
{ 
    r = true; 
} 

Es más fácil de leer y mucho menos propensos a introducir difíciles de ver bichos.

+2

No estoy de acuerdo con el uso de llaves. Si se trata de una declaración única, es una declaración única. Como una cuestión de estilo, voy a sangrar, pero no utilizar curlies para declaraciones individuales ... sin embargo, esta es una batalla religiosa. – Armstrongest

+2

@Atomiton absolutamente, prefiero usarlos todo el tiempo porque es probable que regrese y lo cambie en algún momento, que es cuando me equivoco si no los puse allí en primer lugar. Al menos ponerlos en una línea diferente - Espero que podamos estar de acuerdo con eso :) –

+0

Nunca utilizo llaves para una sola declaración, y a menudo vuelvo y le agrego más, y nunca me he olvidado por casualidad de agregar llaves y arruiné mi flujo de control ... A menos que haya estado escribiendo python por un tiempo y luego regrese a C, eso es. –

3

tiempo (r == false)

debería ser

tiempo (! R)

pesar de lo que dice todo el mundo sobre el punto y coma, que es lo que creo que está mal con él :)

+1

'while (r == false)' es más explícito y legible. Supongo que la gente también podría argumentar que debería ser 'while (false == r)', pero odio eso. De todos modos, no es que él 'debería' cambiarlo a '! R' porque' r' es un booleano, por lo que no importará de ninguna manera, lo que significa que es solo una cuestión de estilo. –

+0

¡Siguiendo constantemente la convención 'r' y'!r' en lugar de 'r == false' y' r == true' evita el error de 'r = false' y' r = true' (que NO provocará un error de compilación en java). Si desea que sea más explícito y legible, cambie el nombre 'r' a algo como' continue' o 'found'. – ILMTitan

+1

continuar es una palabra clave por lo que sería un terrible nombre de variable. Tienes razón, sin embargo, cosas como "r" y "s" son nombres de variables terribles. Use un IDE moderno con autocompletado y llámelo algo sensato, como done o found. – ajs410

3

+1 a Daniel DiPaolo. Pensé en publicar una respuesta por separado para proporcionar una aclaración de por qué este es el caso.

Mientras que los bucles en Java se pueden escribir en una de dos maneras. Si hay una sola línea al cuerpo del bucle, puede escribir ellos de una manera corta a mano:

while (true) 
    System.out.println("While loop"); 

Esto imprimirá "While" en la consola hasta que termine el programa. La otra opción es especificar un cuerpo bucle entre llaves, como se ha hecho anteriormente:

int i = 0; 
while (i < 10) { 
    System.out.println("i = " + i); 
    i++; 
} 

Esto imprimirá "i = 0", "i = 1", ..., "i = 9" cada uno en una línea separada.

Lo que el código que publica hace es confundir a los dos. En el bucle while de short-hand, el analizador de Java espera encontrar una declaración entre la condición de bucle while y el punto y coma. Como no encuentra una instrucción aquí, el ciclo while se ejecuta, pero no hace nada; no tiene cuerpo Además, como el ciclo no tiene cuerpo, no hay oportunidad para que su variable r asuma un nuevo valor; la condición siempre se evalúa como verdadera y el bucle nunca sale.

Si se va a negar la condición en el bucle mientras que en el ejemplo, es decir,

boolean r = false ; int s = 0 ; 
while (r != false) ; 
{ 
    s = getInt() ; 
    if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
    else r = true ; 
} 

(tenga en cuenta que dejé el punto y coma errónea de allí), se verá que el cuerpo del ciclo previsto pueda ejecutar con precisión una vez, ya que el bucle nunca se ejecutará.

3

Además de otros comentarios, también debe cambiar el caso a

if (s < 0 || s > 2) 

Es mucho más comprensible esta manera.

+0

+1 Absolutamente, la negación hace que sea una tarea ardua leer algo que debería ser simple. –

1

Respuesta no relacionada, realmente te recomiendo que sigas las pautas de estilo de Sun.

boolean r = false ; 
int s = 0 ; 
while (r == false) { 
    s = getInt() ; 
    if (!(s>=0 && s<=2)) { 
     System.out.println ("try again not a valid response") ; 
    } else { 
     r = true ; 
    } 
} 

Usted podría deshacerse de la variable y el r si/condición else si se evalúa el resultado en el que uno mismo bucle.

int s = 0; 

while((s = getInt()) < 0 || s > 2) { 
    System.out.println("Try again, not a valid response"); 
}