2015-06-28 5 views
1

Я реализовал простую программу HashMap, в которой хранятся имя и возраст людей. вот мой код:Исключение в потоке main java.util.InputMismatchException

import java.util.*; 

class StoreName { 
    public static void main(String[] args) { 
     HashMap<String, Integer> map = new HashMap<String, Integer>(); 
     Scanner sc = new Scanner(System.in); 
     for (int i = 0; i < 5; i++) { 
      String name = sc.nextLine(); 
      int age = sc.nextInt(); 
      map.put(name, age); 
     } 

     for (String key : map.keySet()) 
      System.out.println(key + "=" + map.get(key)); 
    } 
} 

, когда я беру входные данные от nextInt() Сканер бросает InputMismatchException Exception , но если я вход от nextLine(), а затем разобрать его в междунар то мой код работает properly.Please объяснить меня.

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

+0

Возможный дубликат [Проблема с сканером при использовании следующей строки после следующегоXXX] (http://stackoverflow.com/questions/7056749/scanner-issue-when-using-nextline-after-nextxxx) – Tom

ответ

6

sc.nextInt() не читает всю строку.

Предположим, вы вошли

John 
20 
Dan 
24 

Теперь давайте посмотрим, что каждый вызов Сканер вернется:

String name=sc.nextLine(); // "John" 
    int age=sc.nextInt(); // 20 
    String name=sc.nextLine(); // "" (the end of the second line) 
    int age=sc.nextInt(); // "Dan" - oops, this is not a number - InputMismatchException 

Следующая небольшое изменение будет получить за тем исключением:

for(int i=0;i<5;i++) 
{ 
    String name=sc.nextLine(); 
    int age=sc.nextInt(); 
    sc.nextLine(); // add this 
    map.put(name,age); 
} 

Теперь, Сканер будет вести себя правильно:

String name=sc.nextLine(); // "John" 
int age=sc.nextInt(); // 20 
sc.nextLine(); // "" (the end of the second line) 
String name=sc.nextLine(); // "Dan" 
int age=sc.nextInt(); // 24 
sc.nextLine(); // "" (the end of the fourth line) 
+0

Спасибо за объяснение. Это помогло мне проблема. – prak

+0

У меня есть еще один вопрос. Есть ли какое-либо конкретное преимущество использования nextInt() для синтаксического анализа ввода строки в целочисленный тип? Пожалуйста, объясните. – prak

+0

@prak Я не вижу никакой пользы в использовании nextInt. Внутри он вызывает 'Integer.parseInt' и бросает InputMismatchException, когда он ловит исключение NumberFormatException. Я предпочитаю самостоятельно разбирать записи String. – Eran

1

Попробуйте использовать sc.next() для чтения имя вместо использования nextLine()

for (int i = 0; i < 5; i++) { 
    String name = sc.next();//Change here 
    int age = sc.nextInt(); 
    map.put(name, age); 
} 

подробное объяснение разницы между следующей() и nextLine() можно найти здесь

What's the difference between next() and nextLine() methods from Scanner class?

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