tipos - La lectura de entrada usando Scanner causa un bucle infinito en Java
sentencia do while (4)
En mi programa estoy tratando de hacer que un usuario ingrese un int entre 1-3 y luego haga algo basado en lo que escriben. Si no es un número o no es una de las opciones, entonces les permitirá volver a ingresar una opción válida.
El problema que tengo es que tengo problemas para generar ideas sobre cómo no tener un ciclo infinito y simplemente permitirles ingresar un número después de que la consola les dice que ingresaron una entrada no válida.
int i = 0;
while (i < 1) {
try {
int level = scan.nextInt();
i+=1;
if (level == 1) {
System.out.println("You selected level 1!");
//Start the game
} else if (level == 2) {
System.out.println("You selected level 2!");
//Start the game
} else if (level == 3) {
System.out.println("You selected level 3!");
//Start the game
} else {
System.out.println("That''s not an option!");
i-=1;
}
} catch(InputMismatchException input) {
System.out.println("That''s not an option!");
i-=1;
}
}
Cuando ingresa una entrada no válida, necesita borrarla. Agregue scan.next()
cuando la excepción de entrada se scan.next()
con next () :
catch(InputMismatchException input) {
System.out.println("That''s not an option!");
scan.next();
i-=1;
}
Es mejor escribir el código de esta manera:
while(true){
try{
int level = scan.nextInt();
if(level==1){
System.out.println("You selected level 1!");
break;
}else if(level==2){
System.out.println("You selected level 2!");
break;
}else if(level==3){
System.out.println("You selected level 3!");
break;
}else{
System.out.println("That''s not an option!");
continue;
}
}catch(InputMismatchException input){
System.out.println("That''s not an option!");
continue;
}
}
continue
reanudará inmediatamente la ejecución del bucle en la parte superior, y el break
saltará inmediatamente también el corchete de cierre }
del tiempo. Esto elimina el uso de la variable de contador i
, que era completamente inútil para el código. Además, este código nunca se ejecutará indefinidamente, a menos que el usuario ingrese indefinidamente valores incorrectos.
Espero que esto haya ayudado, ¡buena suerte!
No es exactamente la respuesta que esperabas, pero: refactoriza este código. Recuerde los conceptos básicos de Java, donde cada bit funcional tiene su propio método. Por lo tanto, utilice un método que lea la entrada y devuelva el nivel seleccionado (o -1 si no hay nada):
int readInput() {
// your code here, returning either the level or -1 on bad input
}
Y luego llámalo por tu ciclo de lectura:
int selected;
do {
selected = readInput();
} while(selected < 1);
Puede proceder de una manera mucho más simple. Los 3 casos válidos son muy similares y se pueden tratar como uno, el juego solo se puede iniciar una vez después del ciclo porque sabemos que una vez que el ciclo sale, el level
tiene un valor válido.
boolean valid = false;
int level;
do {
try {
level = scan.nextInt();
valid = 1 <= level && level <= 3;
if (valid) {
System.out.println(String.format("You selected level %d !",level));
} else {
System.out.println("That''s not an option!");
}
} catch(InputMismatchException input) {
scan.next();
System.out.println("That''s not an option!");
}
} while (!valid);
// start the game