Si l'utilisateur entrait une valeur non numérique par exemple "bonjour", je veux donner à l'utilisateur une nouvelle chance d'entrer une valeur numérique jusqu'à ce qu'il réussisse.
exécutation du code ci-dessous, le texte "Ce n'est pas Une valeur numérique. Entrez une valeur numérique: ", affichera dans la console, si l'utilisateur entre une valeur non numérique. Cependant, l'utilisateur ne pourra pas entrer une nouvelle valeur. Parce que le message d'erreur "exception dans le fil ..." affichera et arrêtera le programme. P>
Comment puis-je résoudre ce problème? P>
EDIT! STRUT> code ancien p>
Nouveau code (ce code fonctionne,
5 Réponses :
Veuillez essayer ci-dessous le code donné:
int number; Scanner s = new Scanner (System.in); System.out.println ("Enter a numeric value: "); do { try { number = Integer.parseInt (s.nextLine ()); //Do your work break; } catch (Exception e) { System.out.println ("This is not a numeric value. Enter a numeric value: "); } } while (true); }
Utilisez NumberFormatXception au lieu de la classe d'exception de base
int number; Scanner s = new Scanner(System.in); System.out.println("Enter a numeric value: "); do { try { number = Integer.parseInt(s.nextLine()); //Do your work break; } catch (NumberFormatException e) { System.out.println("This is not a numeric value. Enter a numeric value: "); } } while (true); }
Cela a résolu le problème que j'ai affiché. Cependant, il arrête complètement le programme. Toute méthode appelée après ne fonctionne pas. Avez-vous un moyen de résoudre ce problème?
On dirait que vous souhaitez boucler pour toujours jusqu'à ce que l'utilisateur entre dans un entier valide. Un moyen courant d'exprimer "la boucle pour toujours" est avec Un problème avec l'utilisation de Un moyen d'utiliser ce problème consiste à utiliser Voici une petite fonction qui boucle pour toujours jusqu'à ce que l'utilisateur entre une valeur pouvant être analysée comme un Vous pouvez appeler la méthode comme celle-ci: p> tandis que (vrai) {...} code>. C'est une "boucle infinie". La seule façon de sortir de cette boucle est avec une instruction code> Break code> ou une instruction code> renvoyer code> (ou en jetant une exception, mais dans ce cas, vous voulez attraper strud> em> l'exception et continuez boucler).
Scanner.NexTint () code> Est-ce que si la valeur n'est pas un entier, la valeur restera dans le tampon du scanner. Si vous continuez à appeler
NEXTINT () CODE>, vous continuerez à obtenir
INPUTMISMATCHEXCEPTION CODE> S puisque le scanner continuera à tenter d'interpréter la même mauvaise entrée en tant qu'oquet, encore et encore une fois . P>
scanner.nextline () code> pour lire la valeur sous forme de chaîne, puis utilisez
integer.parseint (chaîne) Code> Pour convertir la chaîne
code> sur un
int code>. Si la conversion échoue,
integer.parseint (string) code> jette un
numberFormatxception code>. Vous pouvez gérer cette exception en l'attrapant. P>
int p>
Essayez ce qui suit, si vous prenez votre entrée sous forme de chaîne, vous pouvez parseint pour vérifier s'il s'agit d'une valeur entière } p> p>
Je ne pense pas que vous comprenez vraiment où vient l'exception. La ligne lancer une nouvelle exception (); code> ne fonctionne jamais strong> em> dans votre code. En effet, votre instruction IF indique
si (numéro! = (Int) numéro) code>, qui ne sera jamais vrai car la variable
numéro code> est déjà du type
int code>, donc vous disiez fondamentalement
si (numéro! = numéro) code>, qui ne peut jamais être vrai. Si vous jetez un coup d'œil à la méthode
NEXTINTINT () CODE> SCANNER, vous remarquerez qu'il lance réellement
INPUTMISMATCHEXCEPTION CODE>. C'est l'exception que vous attrapez avec votre try-catch, mais ce n'est pas l'exception qui provoque le message d'erreur. Alors, où est cette exception venant de? La ligne
numéro = S.Nextint (); code> n'est pas un code compilable. Vous avez défini
S code> à l'intérieur du bloc d'essai, donc
s code> n'existe que à l'intérieur em> le bloc d'essai fort>. Vous obtenez une exception lorsque vous essayez d'y accéder dans le bloc de capture car
s code> n'est pas une variable là-bas; Il n'existe pas autant que le compilateur est concerné. Le correctif est assez simple; Il suffit de déplacer la déclaration pour
s code> vers l'extérieur du bloc d'essai et placez la boucle tandis que le bloc de try-catch. N'oubliez pas non plus de consommer les séparateurs de ligne dans le flux d'entrée en utilisant
s.nextline () code> chaque fois que vous essayez de lire un int. Voici un exemple de la façon dont je le ferais:
Vous avez une boucle DO-TIX à l'intérieur de votre bloc de capture. Où pouvez-vous déplacer cette boucle afin d'inviter en permanence l'utilisateur à entrer en saisissant simultanément des entrées non numériques?
Le numéro de contrôle
! = (Int) numéro code> est sans signification, car
numéro code> est un
int code>. Vous n'allez pas sur cette ligne si votre entrée n'est pas une `int.
Est-ce que cela répond à votre question? Scanner ignore NextLline () après avoir utilisé Suivant () ou Nextfoo ( )?