2010-11-15 3 views
0

J'ai le code suivant que j'utilise pour que l'utilisateur saisisse un entier, vérifiez que l'entrée est valide et, si ce n'est pas le cas, demandez une nouvelle saisie. Lorsque le code est exécuté, tout fonctionne correctement jusqu'à ce qu'une entrée non valide soit donnée, à quel point le code se bloque sans pause pour demander une nouvelle entrée jusqu'à ce qu'un débordement de pile se produise, et je ne sais pas pourquoi. Le code:Pourquoi cette méthode de saisie de l'utilisateur ne fonctionne-t-elle pas?

//Create the scanner object 
private static Scanner in = new Scanner(System.in); 

//Function to get input in integer form, complete with exception handling 
//A value of -1 means the user is done inputing 
public static int getInt() 
{ 
    int num; 

    //Begin try block 
    try 
    { 
     //Get the user to input an integer 
     num = in.nextInt(); 

     //Make sure the integer is positive. Throw an exception otherwise 
     if (num < -1) 
      throw new InputMismatchException(); 
    } 

    //If an exception occurred during the inputting process, recursively call this function 
    catch (InputMismatchException e) 
    { 
     System.out.println("Error: Input must be a positive integer, or -1."); 
     System.out.print("Enter a score: "); 
     num = getInt(); 
    } 

    //Return the inputed number 
    return num; 
} 

Répondre

3

Lorsqu'un scanner jette un InputMismatchException, le scanner ne passer le jeton qui a fait l'exception, de sorte qu'il peut être récupéré ou sauté par une autre méthode

Ainsi parle le javadoc, c'est-à-dire que la chaîne qui n'est pas un nombre n'est pas automatiquement supprimée de l'entrée. Appelez in.next() manuellement pour le supprimer.

+0

+1 belle prise '' ' –

+0

Cela le corrige. Merci beaucoup! – Lewis

0

Est-il nécessaire que la fonction soit récursive? On dirait que cela devrait être assez facile à faire avec une simple boucle.

0

getInt() -> if (num < -1) Exception throw() -> catch (Exception) -> num = getInt()

comment voulez-vous pas à boucle?

1

Vous devez appeler le next(); pour ignorer l'entrée non valide avant d'appeler le nextInt(); une fois de plus.

Questions connexes