Кажется, что метод класса hasNextInt () класса сканера позволяет использовать десятичную дробь, или, возможно, это вызвано чем-то другим.

1
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. Кто-нибудь пролил свет?

  • 0
    Вы можете опубликовать трассировку стека?
Теги:
java.util.scanner

2 ответа

1

Для ввода 2. первый int равен 2, так что playGame() выполняется, но done по-прежнему false поэтому из-за choice.nextInt() цикла choice.nextInt() while(!done) choice.nextInt() снова choice.nextInt() . который не является int.

Отсюда исключение.

  • 0
    Если для начала значение действительно 2.3 , hasNextInt() вернет false .
  • 0
    Хорошо, спасибо, я понял. Есть идеи для исправления?
Показать ещё 3 комментария
0

Вы только проверяете, что 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();
    // ...
}
  • 0
    Это сработало! Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню