2015-05-31 2 views
0

Я занимаюсь упражнениями, связанными с обработкой исключений. При использовании класса Scanner и последующих упражнений для проверки InputMismatchExceptions я получил следующие результаты из следующего кода.Ошибка: целые числа, добавленные вместе при последовательном использовании класса сканера

static Scanner sc = new Scanner(System.in); 

public static void main(String[] args){ 
    System.out.print("Enter an integer: "); 
    int a = getInt(); 
    System.out.print("Enter a second integer: "); 
    int b = getInt(); 
    int result = a + b; 
    System.out.println(result); 
} 

public static int getInt(){ 
    while (true){ 
     try { 
      return sc.nextInt(); 
     } 
     catch(InputMismatchException e){ 
      System.out.print("I'm sorry, that's not an integer." 
        + " Please try again: "); 
      sc.next(); 
     } 
    } 
} 

Выход был:

Enter an integer: 2 3 
Enter a second integer: 5 

кажется, что если для первого созыва nextInt() Я вхожу «2 3», или два целых числа с пространством между ними, в следующий раз, что nextInt() вызывается, он получает первые два целых числа, добавленные вместе, а затем останавливает программу. Что здесь происходит?

P.S. У кого-нибудь есть советы для меня в форматировании моего кода в лучшую сторону и сделать его более организованным для чтения других кодеров?

+1

Смотрите, если [это] (http://stackoverflow.com/questions/13102045/skipping-nextline-after-use-next -nextint-or-other-nextfoo-methods). –

+0

Я посмотрел, я не думаю, что это применимо. В любом случае спасибо. –

ответ

1

Когда вы введете «2 3» (два целых числа с пробелом между ними), scanner.nextInt() потянет в 2 и оставит 3 в сканере. Теперь, когда будет вызван следующий nextInt(), он вытащит 3, оставшихся без необходимости вводить больше данных.

Вы можете обойти это, используя nextLine() и проверить, что входная строка не содержит пробелов.

Что-то вроде этого:

static Scanner sc = new Scanner(System.in); 

public static void main(String[] args) { 
    System.out.print("Enter an integer: "); 
    int a = getInt(); 
    System.out.print("Enter a second integer: "); 
    int b = getInt(); 
    int result = a + b; 
    System.out.println(result); 
} 

public static int getInt() { 
    while (true) { 
     try { 
      String input = sc.nextLine(); 
      if (!input.contains(" ")) { 
       int integer = Integer.parseInt(input); 
       return integer; 
      } else { 
       throw new InputMismatchException(); 
      } 
     } catch (InputMismatchException | NumberFormatException e) { 
      System.out.print("I'm sorry, that's not an integer. Please try again: "); 
     } 
    } 
} 

Результаты:

Enter an integer: 2 3 
I'm sorry, that's not an integer. Please try again: 2 
Enter a second integer: 3 
5 
+0

Спасибо! Это сработало. Однако я добавил еще один оператор catch в случае, когда буквы были введены в nextLine(), а не в числах: –

+0

catch (NumberFormatException d) –

+0

@AdamOdell Хорошая уловка ... Посмотрите мои обновления для этого. – Shar1er80

Смежные вопросы