web-dev-qa-db-fra.com

Pourquoi reçois-je InputMismatchException?

Jusqu'à présent, j'ai ceci:

public double checkValueWithin(int min, int max) {
    double num;
    Scanner reader = new Scanner(System.in);
    num = reader.nextDouble();                         
    while (num < min || num > max) {                 
        System.out.print("Invalid. Re-enter number: "); 
        num = reader.nextDouble();                         
    }
    return num;
}

et ça:

public void askForMarks() {
    double marks[] = new double[student];
    int index = 0;
    Scanner reader = new Scanner(System.in);
    while (index < student) {
        System.out.print("Please enter a mark (0..30): ");
        marks[index] = (double) checkValueWithin(0, 30); 
        index++;
    }
}

Lorsque je teste cela, il ne peut pas prendre de double numéro et j'ai reçu ce message:

Exception in thread "main" Java.util.InputMismatchException
at Java.util.Scanner.throwFor(Scanner.Java:909)
at Java.util.Scanner.next(Scanner.Java:1530)
at Java.util.Scanner.nextDouble(Scanner.Java:2456)
at MarkingSystem.checkValueWithin(MarkingSystem.Java:25)
at MarkingSystem.askForMarks(MarkingSystem.Java:44)
at World.main(World.Java:6)
Java Result: 1

Comment puis-je réparer ça?

6
Trần Trung

Ici vous pouvez voir la nature de Scanner :

double nextDouble ()

Renvoie le jeton suivant sous forme de double. Si le jeton suivant n'est pas un flottant ou est hors de portée, InputMismatchException est levée.

Essayez d'attraper l'exception

try {
    // ...
} catch (InputMismatchException e) {
    System.out.print(e.getMessage()); //try to find out specific reason.
}

[~ # ~] mise à jour [~ # ~]

CAS 1

J'ai essayé votre code et il n'y a rien de mal à cela. Vous obtenez cette erreur car vous devez avoir entré la valeur String. Lorsque j'ai entré une valeur numérique, elle s'exécute sans aucune erreur. Mais une fois que j'ai entré String c'est throw le même Exception que vous avez mentionné dans votre question.

CAS 2

Vous avez entré quelque chose qui est hors de portée comme je l'ai mentionné ci-dessus.

Je me demande vraiment dans quoi vous auriez pu essayer d'entrer. Dans mon système, il fonctionne parfaitement sans changer une seule ligne de code. Il suffit de copier tel quel et d'essayer de le compiler et de l'exécuter.

import Java.util.*;

public class Test {
    public static void main(String... args) {
        new Test().askForMarks(5);
    }

    public void askForMarks(int student) {
        double marks[] = new double[student];
        int index = 0;
        Scanner reader = new Scanner(System.in);
        while (index < student) {
            System.out.print("Please enter a mark (0..30): ");
            marks[index] = (double) checkValueWithin(0, 30); 
            index++;
        }
    }

    public double checkValueWithin(int min, int max) {
        double num;
        Scanner reader = new Scanner(System.in);
        num = reader.nextDouble();                         
        while (num < min || num > max) {                 
            System.out.print("Invalid. Re-enter number: "); 
            num = reader.nextDouble();                         
        } 

        return num;
    }
}

Comme vous l'avez dit, vous avez essayé d'entrer 1.0, 2.8 et etc. Veuillez essayer avec ce code.

Remarque: Veuillez saisir le numéro un par un, sur des lignes distinctes. Je veux dire, entrez 2.7, appuyez sur entrée puis entrez le deuxième chiffre (par exemple 6.7).

7
Ravi

Au lieu d'utiliser un point, comme: 1.2, essayez d'entrer comme ceci: 1,2.

8
linha9

Puisque vous avez la boucle d'entrée manuelle de l'utilisateur, une fois que le scanner a lu votre première entrée, il passera le chariot/retour à la ligne suivante qui sera également lue; bien sûr, ce n'est pas ce que vous vouliez.

Vous pouvez essayer ceci

try {
    // ...
} catch (InputMismatchException e) {
    reader.next(); 
}

ou bien, vous pouvez consommer ce retour chariot avant de lire votre prochaine double entrée en appelant

reader.next ()

2
Infinity

J'ai rencontré le même problème. Étrange, mais la raison en était que l'objet Scanner interprète les fractions en fonction de la localisation du système. Si la localisation actuelle utilise une virgule pour séparer les parties des fractions, la fraction avec le point se transformera en type String. D'où l'erreur ...

2
user3438931

Fournissez-vous une entrée en écriture à la console?

Scanner reader = new Scanner(System.in);
num = reader.nextDouble();  

Il s'agit d'un retour double si vous entrez simplement un nombre comme 456. Dans le cas où vous saisissez une chaîne ou un caractère à la place, il lèvera Java.util.InputMismatchException lorsqu'il essaiera de faire num = reader.nextDouble ().

0
chinmay.sagade