-1
votes

Y a-t-il un moyen de prévenir la manipulation automatique des exceptions?

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.

Comment puis-je résoudre ce problème?

EDIT!
Nouveau code (ce code fonctionne, sauf il arrête complètement le programme. Chaque méthode appelée ensuite, ne fonctionnera pas.) Edit2! Il n'a pas fonctionné! xxx

code ancien xxx


3 commentaires

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 est sans signification, car numéro est un int . 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 ( )?


5 Réponses :


1
votes

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);

}


0 commentaires

2
votes

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);

}


1 commentaires

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?



1
votes

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 tandis que (vrai) {...} . C'est une "boucle infinie". La seule façon de sortir de cette boucle est avec une instruction Break ou une instruction renvoyer (ou en jetant une exception, mais dans ce cas, vous voulez attraper l'exception et continuez boucler).

Un problème avec l'utilisation de Scanner.NexTint () Est-ce que si la valeur n'est pas un entier, la valeur restera dans le tampon du scanner. Si vous continuez à appeler NEXTINT () , vous continuerez à obtenir INPUTMISMATCHEXCEPTION S puisque le scanner continuera à tenter d'interpréter la même mauvaise entrée en tant qu'oquet, encore et encore une fois .

Un moyen d'utiliser ce problème consiste à utiliser scanner.nextline () pour lire la valeur sous forme de chaîne, puis utilisez integer.parseint (chaîne) Pour convertir la chaîne sur un int . Si la conversion échoue, integer.parseint (string) jette un numberFormatxception . Vous pouvez gérer cette exception en l'attrapant.

Voici une petite fonction qui boucle pour toujours jusqu'à ce que l'utilisateur entre une valeur pouvant être analysée comme un int Xxx

Vous pouvez appeler la méthode comme celle-ci: xxx


0 commentaires

0
votes

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 xxx

}


0 commentaires

1
votes

Je ne pense pas que vous comprenez vraiment où vient l'exception. La ligne lancer une nouvelle exception (); ne fonctionne jamais dans votre code. En effet, votre instruction IF indique si (numéro! = (Int) numéro) , qui ne sera jamais vrai car la variable numéro est déjà du type int , donc vous disiez fondamentalement si (numéro! = numéro) , qui ne peut jamais être vrai. Si vous jetez un coup d'œil à la méthode NEXTINTINT () SCANNER, vous remarquerez qu'il lance réellement INPUTMISMATCHEXCEPTION . 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 (); n'est pas un code compilable. Vous avez défini S à l'intérieur du bloc d'essai, donc s n'existe que à l'intérieur le bloc d'essai . Vous obtenez une exception lorsque vous essayez d'y accéder dans le bloc de capture car s 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 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 () chaque fois que vous essayez de lire un int. Voici un exemple de la façon dont je le ferais: xxx


0 commentaires