1
votes

Question sur l'exception (try-catch) dans une boucle

J'ai déjà ce problème plusieurs fois sur d'autres projets. En ce moment, j'essaie de comprendre la gestion des exceptions mais je ne sais toujours pas comment cela fonctionne exactement. J'ai essayé de programmer une calculatrice avec une boucle et quand j'essaie de saisir une chaîne, il y aura InputMismatchException - j'ai essayé de l'attraper, mais pour une raison quelconque après la clause catch, java me donne une autre InputMismatchException, pourquoi?

Choose operator (1 for +)(2 for -)(3 for *)(4 for /): 
er
Invalid Input, try again!
Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at Calculator.main(Calculator.java:47)

Au début, il y avait une boucle infinie, que je résous par scanner.nextInt (); dans le bloc catch, mais j'obtiens toujours cette erreur:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Calculator {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int loop = 1;
        while (loop == 1) {

            try {

                System.out.println("First number:");
                int num1 = scanner.nextInt();
                System.out.println("Second number:");
                int num2 = scanner.nextInt();

                System.out.println("Choose operator (1 for +)(2 for -)(3 for *)(4 for /): ");

                int userInput = scanner.nextInt();

                switch (userInput) {
                case 1:
                    System.out.println("Result: " + num1 + " + " + num2 + " = " + (num1 + num2));
                    break;
                case 2:
                    System.out.println("Result: " + num1 + " - " + num2 + " = " + (num1 - num2));
                    break;
                case 3:
                    System.out.println("Result: " + num1 + " * " + num2 + " = " + (num1 * num2));
                    break;
                case 4:
                    System.out.println("Result: " + num1 + " / " + num2 + " = " + (num1 / num2));
                    break;
                default:
                    System.out.println("Invalid Input!");

                }

                System.out.println("Repeat? (1 = yes)(0 = nein)");

                loop = scanner.nextInt();

            } catch (InputMismatchException e) {
                System.out.println("Invalid Input, try again!");
                scanner.nextInt();

            }

        }
        scanner.close();
        System.out.println("Ciao!");

    }

}

Pourquoi?


0 commentaires

4 Réponses :


1
votes

Probablement parce que vous n'avez pas récupéré le nextInt, puisque la valeur suivante n'était pas un int . ainsi vous essayez de récupérer la même entrée dans votre bloc catch et ainsi avoir à nouveau une InputMismatchException.

Votre Stacktrace pointe également vers la clause catch où vous essayez de récupérer le prochain int ! p >

Je vous suggère de remplacer simplement nextInt dans la clause catch par nextLine:

...
catch (InputMismatchException e) {
    System.out.println("Invalid Input, try again!");
    scanner.nextLine();
}

Ensuite, vous allez commencer votre boucle à nouveau et essayez de lire à nouveau.

Vérifiez également ce fil similaire sur stackoverflow ou les exemples de tutorialspoint pour l'utilisation de Classe Scanner .


1 commentaires

Vous avez raison, alors lisez simplement et ignorez l'entrée non-int en lisant la ligne suivante et redémarrez la boucle et demandez une nouvelle entrée. J'ai édité la réponse.



0
votes

Dans votre premier cas, il entre dans la boucle infinie lorsque InputMismatchException est lancé par scanner.nextInt (); et vous avez géré cette exception, donc il recommencera itération suivante qui finit par invoquer scanner.nextInt (); à nouveau mais dans ce cas, le scanner ne se déplace pas vers la nouvelle ligne, il obtiendra donc String au lieu de int auquel il s'attendait et lancera InputMismatchException . Vous pouvez le résoudre par:

        catch (InputMismatchException e) {
            System.out.println("Invalid Input, try again!");
            scanner.nextLine(); // change nextInt to nextLine
        }

Dans votre code actuel, lorsque InputMismatchException le lance, il va au bloc catch et à votre bloc catch et à nouveau il exécute scanner.nextInt (); qui lèvent l'exception et votre thread de boucle se termine.


2 commentaires

Wow merci!! Mais pourquoi exactement je dois utiliser scanner.nextLine () ?


nextLine () au-delà de la ligne actuelle du scanner



0
votes
  1. Après avoir détecté l'exception, vous devez analyser l'entrée d'incompatibilité. Vous pouvez utiliser scanner.nextLine () et le scanner analysera la mauvaise entrée pour que votre boucle recommence.
  2. Votre programme recommence après l'exception. Si vous souhaitez continuer la boucle après l'exception, vous devez utiliser plusieurs tentatives de capture et utiliser do while jusqu'à ce que l'utilisateur entre la bonne entrée.
  3. Integer num1 = null;
    do {
       try {
         num1 = scanner.nextInt();
       } catch (InputMismatchException e) {
         System.out.println("Invalid Input, try again!");
         scanner.nextLine();
       }
    } while (num1 == null);
    

0 commentaires

-1
votes

si nous voulons attraper l'exception plutôt que de la jeter en dehors de la méthode, alors la ligne qui pourrait potentiellement lever l'exception devrait être dans le bloc try comme

try{
//code which can throw exception T
}
catch( exceptions T){
// what if exception handle it
} 

mais dans votre cas scanner.nextInt ( ); produit l'exception dans le bloc try et le contrôle passe au bloc catch ici à nouveau, vous exécutez la même ligne scanner.nextLine (); qui lève à nouveau l'exception et cette fois elle n'est pas gérée supprimer scanner.nextInt (); ligne du bloc catch


0 commentaires