Как бороться со случайным вводом двойного при использовании .nextInt () в Java - PullRequest
2 голосов
/ 27 января 2010

Поэтому я пытаюсь разобраться с возможным исключением пользователя, вводящего двойное число, когда мой сканер ожидает интегрального ввода:

boolean go = true;
do {
        System.out.print("Please enter one grade from 0 - 100. To end input, enter a        
        negative integral value.\n");
    try {
            int myInt = scanner.nextInt();
            .
            .
            .
    }
    catch (InputMismatchException e) {
            System.out.println("Oops!! Please enter only integral numbers");
    }
while (go);

Это работает для нечислового ввода (то есть буквы), нонет, если я введу, скажем, 3.14 или другой символ ASCII, как -.В этом случае строки ниже повторяются, пока я не убью программу.

Please enter one grade from 0 - 100. To end input, enter a negative integral value.
Oops!! Please enter only integral numbers.

Есть идеи?: D

Ответ: Я использую System.in и java 6.

Ответы [ 2 ]

4 голосов
/ 27 января 2010

Я предполагаю, что когда вы говорите, взрывается, вы имеете в виду, что вы получаете бесконечный цикл

Oops!! Please enter only integral numbers

Попробуйте вместо этого сделать следующее:

try {
  int myInt = scanner.nextInt();
  // …
}
catch (InputMismatchException e) {
  System.out.println("Oops!! Please enter only integral numbers");
  System.out.println(scanner.next() + " was not valid input.");
}

Редактировать : Я вижу, что мое первоначальное предположение было правильным; -)

Причина, по которой это происходит, заключается в том, что при сбое nextInt () внутренний указатель не перемещается, и поэтому каждый раз, когда вы можете снова вызывать nextInt, он выходит из строя на одном и том же токене. Итак, сначала нужно очистить токен, что я и делаю, распечатав текст, который является недопустимым. Это приводит к тому, что новый токен будет считан из входного потока.

2 голосов
/ 27 января 2010

Я попробовал код, который вы разместили выше (используя System.in InputStream), и удваивает значение, как ожидается, InputMismatchException. Какой метод ввода вы используете и какую версию Java?

...