Scanner choice = new Scanner(System.in);
while(!choice.hasNextInt()) {
System.out.println("Invalid input");
choice.next();
}
// Carry out appropriate method relating to user choice
boolean done = false; // Loop is not finished
while (!done) {
int i = choice.nextInt(); // Save the user choice as int i
/*
* A switch statement here would probably be more elegant but this works too
* Problem: If the user inputs a non-integer number e.g. 2.3 the program explodes :(
*/
if (i == 1) {
newGame(); // Call newGame method
} else if (i == 2) {
playGame(); // Call playGame method
} else if (i == 3) {
viewResults(); // Call viewResults method
} else if (i == 4) {
done = true; // If user quits, the loop is done
quitGame(); // Call quitGame method
} else {
System.out.println("Invalid input");
}
}
Единственный допустимый ввод для этого должен быть числом 1, 2, 3 и 4. Если я ввешу строку, он не примет его. Если я ввожу число больше 4, оно не принимает его. Однако, если я должен был ввести 2.3 или что-то, программа выйдет из строя. Я не вижу, что это вызывает это, поскольку 2.3 не является целым числом, и я не знаю, как он проходит метод hasNextInt() в Scanner. Кто-нибудь пролил свет?
Для ввода 2.
первый int равен 2
, так что playGame()
выполняется, но done
по-прежнему false
поэтому из-за choice.nextInt()
цикла choice.nextInt()
while(!done)
choice.nextInt()
снова choice.nextInt()
.
который не является int.
Отсюда исключение.
2.3
, hasNextInt()
вернет false
.
Вы только проверяете, что choice.hasNextInt()
для первого ввода. Во второй раз он не проверяется. Переместить проверку в while
циклы, так что она выглядит следующим образом:
boolean done = false;
while (!done) {
while(!choice.hasNextInt()) {
System.out.println("Invalid input");
choice.nextLine(); // drop entire line, not just next token
}
int i = choice.nextInt();
// ...
}