-1

Donc, j'utilisais ce code dans mon programme et chaque fois que je donnais une entrée composée de plusieurs mots, le compilateur exécute le bloc catch plusieurs fois. Je l'ai aussi essayé avec différentes méthodes jusqu'à maintenant tous les efforts sont devenus vains.catch block s'exécute plusieurs fois pour InputMismatchException

Méthode 1:

Scanner scanner = new Scanner(System.in); 
int size = 0; 
while (true) 
{ 
    try 
    { 
     size = scanner.nextInt(); 
     break; 
    } 
    catch (InputMismatchException e) 
    { 
     System.out.println("Enter valid input (Digit Only)"); 
     scanner.next(); 
     continue; 
    } 
} 

Méthode 2:

Scanner scanner = new Scanner(System.in); 
int size = 0; 
boolean bError = true; 
while (bError) 
{ 
    if (scanner.hasNextInt()) 
     size = scanner.nextInt(); 
    else 
    { 
     System.out.println("Enter valid input (Digit Only)"); 
     scanner.next(); 
     continue; 
    } 
    bError = false; 
} 

Méthode 3:

Scanner scanner = new Scanner(System.in); 
int size = 0; 
while (true) 
{ 
    if (scanner.hasNextInt()) 
    size = scanner.nextInt(); 
else 
{ 
    scanner.next(); 
    System.out.println("Enter valid input (Digit Only)"); 
continue; 
} 
String sizeStr = Integer.toString(size); 
Pattern pattern = Pattern.compile(new String ("^[0-9]*$")); 
Matcher matcher = pattern.matcher(sizeStr); 
if(matcher.matches()) 
{  
    break; 
} 
else 
{ 
    System.out.println("Enter valid input (Digit Only)"); 
    continue; 
} 
} 

Méthode 4:

Scanner scanner = new Scanner(System.in); 
int size = 0; 
while (scanner.hasNext()) 
{ 
    if (scanner.hasNextInt()) 
    { 
     size = scanner.nextInt(); 
     System.out.println(size); 
     break; 
    } 
    else 
    { 
     System.out.println("Enter valid input (Digit Only)"); 
     scanner.next(); 
    } 
} 

Je suis maintenant capable de faire la tâche en prenant une entrée String, puis en l'analysant en int. Mais le doute initial reste toujours que cela ne fonctionnait pas correctement. Le code ci-dessous fonctionne bien.

Scanner scanner = new Scanner(System.in); 
int size = 0; 
while (true) 
{ 
    try 
    { 
     String sizeStr = scanner.nextLine(); 
     size = Integer.parseInt(sizeStr); 
     break; 
    } 
    catch (NumberFormatException e) 
    { 
     System.out.println("Enter valid input (Digit Only)"); 
     scanner.next(); 
     continue; 
    } 
} 
+1

Veuillez formater/indenter votre code correctement. Il est difficile d'aider si c'est difficile à lire. – nhouser9

+0

@ nhouser9 done :) – Jaideep

+0

Est-ce utile? http://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-nextint-or-other-nextfoo – nhouser9

Répondre

0

Selon Java Doc (https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html) officiel:

A Scanner breaks its input into tokens using a delimiter pattern, 
which by default matches whitespace. The resulting tokens may then be 
converted into values of different types using the various next 
methods. 

The scanner can also use delimiters other than whitespace. 

Par défaut, tous les suivant *() fonctions de la classe du scanner autre que nextLine() lire le jeton suivant, pas le prochain ligne. Cela signifie qu'il lit jusqu'à ce qu'il trouve un espace. Si vous voulez lire tous les jetons d'une ligne, vous devez utiliser nextLine(), puis formater l'entrée explicitement comme vous le souhaitez.

Considérez cette entrée:

abcd xyz 

Lorsque vous faites scanner.nextInt() ou l'une des fonctions scanner.next *() autres que scanner.nextLine(), que "ABCD" est lu parce qu'il est le jeton suivant. Lorsque vous effectuez scanner.nextLine(), la chaîne complète dans la ligne en cours "abcd xyz" est lue et l'analyseur passe à la ligne suivante. Toutefois, si vous voulez que la fonction nextInt() lise toute la ligne, vous pouvez définir le délimiteur comme étant une nouvelle ligne '\ n'.

Scanner scan = new Scanner(System.in).useDelimiter("\n"); 

En utilisant ceci, vous pouvez obtenir le comportement que vous voulez.