2017-02-17 4 views
0

Je rencontre un problème avec Scanner car il semble prendre le type de valeur d'entrée et forcer la prochaine fois que l'utilisateur saisit une valeur du même type. Je ne trouve aucune raison pour laquelle ce code ne fonctionne pas et me donne une InputMismatchException car j'ai écrit un code comme celui-ci un million de fois et je n'ai pas eu de problèmes.Impossible de trouver une raison pour InputMismatchException

public void register(){ 
    Scanner input=new Scanner(System.in); 
     System.out.println("What course would you like to register for?"); 
     String course_name = input.next(); 
     System.out.println("What section?"); 
     int section = input.nextInt(); 

     for (int i = 0; i < courses.size(); i++) { 
      if (courses.get(i).getCourse_name().equals(course_name)) { 
       if (courses.get(i).getCourse_section() == section) { 
        courses.get(i).AddStudent(this.first_name+" "+this.last_name); 
       } 
      } 
     } 
     input.close(); 
    } 

Ce problème est non seulement pour la méthode register(), mais l'ensemble du programme, par exemple, avec ce code:

public void Options() { 
    Scanner input=new Scanner(System.in); 
    while (true) { 
     System.out.println("What would you like to do (Enter corresponding number):" + "\n" + "1) View all courses" + "\n" + "2) View all courses that are not full" + "\n" + "3) Register on a course" + "\n" + "4) Withdraw from a course" + "\n" + "5) View all courses that the current student is being registered in" + "\n" + "6) Exit"); 
     int user = input.nextInt(); 
     if (user == 1) 
      viewAll(); 
     if (user == 2) 
      viewAllOpen(); 
     if (user == 3) 
      register(); 
     if (user == 4) 
      withdraw(); 
     if (user == 5) 
      viewRegistered(); 
     if (user == 6) { 
      Serialize(); 
      break; 
     } 
    } 

Si l'une des méthodes, telles que le registre nécessaire à l'utilisateur d'entrer une chaîne, l'int utilisateur = input.nextInt(); provoquera une exception InputMismatchException.

+1

Check http://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-nextint-or-other-nextfoo – TheLostMind

Répondre

0

J'ai reproduit ce code et je n'ai pas le même problème. Si l'utilisateur entre un nombre entier tel que 11 lorsqu'il est invité pour le numéro de cours, le code fonctionnera correctement. Bien sûr, si vous entrez quelque chose qui n'est pas un entier, il lancera une exception InputMismatchException. Reportez-vous à la description du document Java pour Scanner # nextInt(), en particulier:

Scanne le jeton suivant de l'entrée comme un int.

Une invocation de cette méthode de la forme nextInt() se comporte exactement de la même manière que l'invocation nextInt (radix), où radix est la base par défaut de ce scanner.

Lancers:

InputMismatchException - si le prochain jeton ne correspond pas à l'expression régulière entier, ou est hors de portée

Read More

Si vous voulez éviter cela et ne veulent pas Pour faire face à un try-catch, vous pouvez suspendre l'exécution jusqu'à ce qu'un entier valide soit donné.

public static void register(){ 
    Scanner input=new Scanner(System.in); 
    System.out.println("What course would you like to register for?"); 
    String course_name = input.next(); 
    System.out.println("What section?"); 
    //Loop until the next value is a valid integer. 
    while(!input.hasNextInt()){ 
     input.next(); 
     System.out.println("Invalid class number! Please enter an Integer."); 
    } 
    int section = input.nextInt(); 
    input.close(); 

    System.out.println(course_name + " " + section); 
} 
+0

Ce n'est pas une question de ne pas entrer dans un entier . Quand je l'exécute, je n'ai même pas la chance d'entrer un nombre entier car l'exception InputMismatchException se produit immédiatement après que j'aie entré le nom du cours pour lequel je voudrais m'inscrire et le programme s'arrête. – UnionSquareBanter

+0

Essayez de fermer le scanner dans la méthode Options dès que vous obtenez votre analyse de la chaîne demandée. Le fait que la ressource soit toujours ouverte peut interférer avec l'ouverture du scanner dans la méthode de registre. Si cela ne fonctionne pas, collez votre trace de pile. 'Entrée du scanner = nouveau scanner (System.in); while (true) { System.out.println ("blah"); int utilisateur = input.nextInt(); input.close() // Autre code ici.' –