try/catch with InputMismatchException : élimination de la boucle infinie
Problème rencontré
Dans un programme qui lit les entrées entières de l'utilisateur, en utilisant un try/ catch pour gérer les entrées invalides, une boucle infinie se produit lorsqu'une InputMismatchException est levée (par exemple, lorsque l'utilisateur saisit un caractère non entier).
Cause de la boucle infinie
La boucle infinie est causée par deux problèmes :
-
Nettoyage des entrées manquantes : Lorsqu'une exception InputMismatchException est levée, le jeton saisi n'est pas consommé à partir du flux d'entrée. Il reste dans le flux, provoquant des tentatives de lecture ultérieures pour lever l'exception à plusieurs reprises.
-
Gestion générale des exceptions : Le bloc catch du try/catch est actuellement défini sur catch (Exception e). Cette gestion large inclut toutes les exceptions, ce qui n'est pas assez spécifique pour l'InputMismatchException que nous devons traiter.
Solution
Pour corriger la boucle infinie et assurer une gestion correcte de l'InputMismatchException, plusieurs étapes peut être pris :
-
Consommer l'entrée erronée : Après avoir attrapé le InputMismatchException, consomme explicitement le jeton d'entrée pour l'empêcher de provoquer des exceptions répétées. Cela peut être fait en appelant input.next(); dans le bloc catch.
-
Utiliser la gestion des exceptions spécifiques : Remplacez le catch (Exception e) par catch (InputMismatchException e) pour gérer spécifiquement uniquement les InputMismatchExceptions.
-
Implémenter la validation : De plus, il est conseillé d'utiliser la méthode scanner.hasNextInt() pour vérifier si l'entrée est un entier avant de tenter de le lire. Cela peut aider à éviter complètement les exceptions.
Voici le code modifié avec les améliorations suggérées :
import java.util.InputMismatchException;
import java.util.Scanner;
public class Except {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
boolean bError = true;
int n1 = 0, n2 = 0, nQuotient = 0;
do {
try {
System.out.println("Enter first num: ");
n1 = input.nextInt();
System.out.println("Enter second num: ");
n2 = input.nextInt();
nQuotient = n1/n2;
bError = false;
}
catch (InputMismatchException e) {
System.out.println("Error!");
input.next(); // Consume the erroneous input
}
} while (bError);
System.out.printf("%d/%d = %d",n1,n2, nQuotient);
}
}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Déclaration:Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn