2016-05-20 2 views
3

J'ai un problème en essayant d'exécuter l'instruction try-catch à l'intérieur de do while loop.I demande à l'utilisateur d'entrer d'abord la lettre et ensuite un nombre et s'il saisit correctement le numéro du programme. Entrez une lettre au lieu du nombre que le programme devrait dire "Une erreur est survenue s'il vous plaît entrez le numéro" et demandez à l'utilisateur d'entrer à nouveau le numéro, mais chaque fois que je tape une lettre, le programme entre dans une boucle infinie. . Et juste va "Une erreur s'est produite, vous devez entrer le numéro" "S'il vous plaît entrer le numéro".Faire tout devient infini avec essayer attraper

public class OmaBrisem { 

    public static void main(String[] args) { 
     Scanner tastatura = new Scanner(System.in); 
     boolean b = true; 
     int a = 0; 
     String r = ""; 
     System.out.println("Please enter a letter"); 
     r = tastatura.next(); 
     do { 
      try { 
       System.out.println("Please enter numerical value"); 
       a = tastatura.nextInt(); 
       b = true; 
      } catch (Exception e) { 
       System.out.println("An error occured you must enter number"); 
       b = false; 
      } 
     } while (!b); 

    } 

} 

Répondre

6

Voici votre problème. Si l'utilisateur entre un numéro de non-numéro où vous attendez un numéro, votre nextInt() lèvera une exception mais il ne supprimera pas la lettre du flux d'entrée!

Cela signifie que lorsque vous rebouclage d'obtenir à nouveau le numéro, la lettre encore là et votre nextInt() soulèvera à nouveau une exception. Et ainsi de suite, ad infinitum (ou au moins jusqu'à la mort thermique de l'univers, ou la machine tombe finalement en panne, selon la première éventualité).

Une façon de résoudre ce problème serait en réalité lire/ignorer le caractère suivant lorsque nextInt() échoue afin qu'il soit supprimé du flux d'entrée. Vous pouvez faire cela avec Scanner.findInLine(".") jusqu'à ce que Scanner.hasNextInt() renvoie la valeur true.

Le code suivant montre une façon de le faire:

import java.util.Scanner; 
public class MyTestProg { 
    public static void main(String [] args) { 
     Scanner inputScanner = new Scanner(System.in); 
     System.out.print("Enter letter, number: "); 

     // Get character, handling newlines as needed 

     String str = inputScanner.findInLine("."); 
     while (str == null) { 
      str = inputScanner.nextLine(); 
      str = inputScanner.findInLine("."); 
     } 

     // Skip characters (incl. newline) until int available. 

     while (! inputScanner.hasNextInt()) { 
      String junk = inputScanner.findInLine("."); 
      if (junk == null) { 
       junk = inputScanner.nextLine(); 
      } 
      System.out.println("Ignoring '" + junk + "'"); 
     } 

     // Get integer and print both. 

     int num = inputScanner.nextInt(); 
     System.out.println("Got '" + str + "' and " + num); 
    } 
} 

Et la transcription suivante, il montre en action:

Enter letter, number: Abcde42 
Ignoring 'b' 
Ignoring 'c' 
Ignoring 'd' 
Ignoring 'e' 
Got 'A' and 42 
+0

Je aime le * jusqu'à la mort thermique de l'univers, ou la machine tombe finalement vers le bas, selon la première éventualité * –

+0

Lorsque vous entrez dans deux lettres en même temps que votre code fonctionne aussi dans un infini en boucle – HasS

+1

@HasS, oui, quand il y a un retour à la ligne qui fait échouer 'findInLine'. - Je n'ai testé qu'avec une seule ligne. Bien que le code ait été conçu uniquement comme un exemple pour illustrer le concept, j'ai corrigé avec une mise à jour. Si le problème persiste, veuillez me communiquer les données de test exactes que vous utilisez. – paxdiablo

0

Il suffit d'ajouter tastatura.nextLine() dans le bloc catch pour rejeter la dernière entrée.

+0

Ce n'est pas mauvais, en supposant que vous êtes heureux de jeter tout le reste de la ligne. Je préfère une approche plus localisée mais, en supposant que vous soyez clair sur l'effet possible, cela fonctionnera également. – paxdiablo

0

Vous pouvez sortir de la boucle par break; lorsque l'exception est pris ... Alors, il suffit d'ajouter:

  break; 

sur vos prises bloc :)

La clause catch ressemblerait à ceci:

catch (Exception e) { 
      System.out.println("An error occured you must enter number"); 
      b = false; 
      break; 
     } 
1

Je réalise que mon programme ignore l'objet du scanner tastatura dans essayer bloc chaque fois que j'insérer une valeur incorrecte et faire en boucle recommence donc je créé de nouveaux obj ect de la classe Scanner et appelé tastatura2 et mon programme fonctionne bien.

Scanner tastatura = new Scanner(System.in); 
     boolean b = true; 
     int a = 0; 
     String r = ""; 
     System.out.println("Please enter a letter"); 
     r = tastatura.next(); 
     do { 
      try { 
       Scanner tastatura2 = new Scanner(System.in); 
       System.out.println("Please enter numerical value"); 
       a = tastatura2.nextInt(); 
       b = true; 
      } catch (Exception e) { 
       System.out.println("An error occured you must enter number"); 
       b = false; 
      } 
     } while (!b); 
+0

Parfois, en utilisant seulement un scanner pour l'entrée conduit à des erreurs, cela m'est arrivé à plusieurs reprises – HasS