2013-05-29 3 views
4

У меня есть этот код, и я хочу, чтобы поймать исключение письмо, но оно продолжает иметь эти ошибки:Java InputMismatchException

Exception in thread "main" java.util.InputMismatchException 
    at java.util.Scanner.throwFor(Scanner.java:840) 
    at java.util.Scanner.next(Scanner.java:1461) 
    at java.util.Scanner.nextInt(Scanner.java:2091) 
    at java.util.Scanner.nextInt(Scanner.java:2050) 
    at exercise_one.Exercise.main(Exercise.java:17) 

А вот мой код:

System.out.print("Enter the number of students: "); 

students = input.nextInt(); 

while (students <= 0) { 

    try { 

     System.out.print("Enter the number of students: "); 

     students = input.nextInt(); 

    } 

    catch (InputMismatchException e) { 

     System.out.print("Enter the number of students"); 

    } 
}  
+0

Первый 'students = input.nextInt();' не находится внутри блока 'try', и вы вводите что-то, что не может быть сохранено в' int'. – jlordo

+0

Да, похоже, это так, но как я могу проверить оба (исключение букв и отрицательных чисел) вместе? –

+0

Легко. Просто удалите первые 2 строки кода, которые вы опубликовали. – jlordo

ответ

6

Вы можете использовать цикл Do-While вместо того, чтобы устранить первый input.nextInt().

do { 
    try { 
     System.out.print("Enter the number of students: "); 
     students = input.nextInt(); 
    } catch (InputMismatchException e) { 
     System.out.print("Invalid number of students. "); 
    } 
    input.nextLine(); // clears the buffer 
} while (students <= 0); 

Поэтому все InputMismatchException могут быть обработаны в одном месте.

+0

Это хорошо. Просто не забудьте инициализировать переменную вашего ученика перед тем, как установить ее на 0. В противном случае вы получите ошибку «переменная, которая не была инициализирована» во время компиляции. – JonathanScialpi

+2

Как написано, если возникает событие InputMismatchException, тогда оно будет печатать 'Введите число студентовEnter количество студентов: '. Возможно, неплохо заменить второй шрифт чем-то вроде 'System.out.println (« Недопустимый ввод. Введите число.")' поэтому пользователь знает, что они сделали то, чего им не было, и поэтому у вас есть строка между приглашением и сообщением об ошибке. – Monkeygrinder

2

из doc

Scanner.nextInt Сканирует следующий токен ввода как int. если следующий маркер не соответствует регулярному выражению Integer, или из диапазона

Так что, кажется, вы не вводите любое целое число в качестве входных данных.

вы можете использовать

 while (students <= 0) { 

     try { 
      System.out.print("Enter the number of students: "); 

      students = input1.nextInt(); 

     } 

     catch (InputMismatchException e) { 
      input1.nextLine(); 
     } 
    } 
+0

Я объявил его как int –

+0

@JimDim .. извините за ошибку ... вы вводите ввод, отличный от целого .. – stinepike

+2

Если кто-то вводит строку типа 'abc', или он вводит число, которое не может быть выраженный в 'int', метод' nextInt() 'генерирует исключение. См. Http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt(). –