2012-12-25 2 views
3

Jusqu'à présent, j'ai ceci:Pourquoi est-ce que j'obtiens InputMismatchException?

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 ceci:

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++; 
    } 
} 

Quand je teste cela, il ne peut pas prendre nombre double et je 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?

+0

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/InputMismatchException.html Regardez ceci. Peut-être que le scanner n'a pas pu analyser ce que vous avez entré dans la console? Par exemple, il a demandé un numéro, vous avez entré "bonjour"? – Aaron

+0

Essayez de faire "nextFloat" à la place. – Aaron

+0

Enlever Scanner reader = new Scanner (System.in); à partir des askForMarks(); Tout fonctionne pour moi alors. – Joe

Répondre

5

ici vous pouvez voir la nature de Scanner:

double nextDouble()

Renvoie le jeton suivant en tant que long. Si le jeton suivant n'est pas un flottant ou si est hors de portée, InputMismatchException est levé.

Essayez d'attraper l'exception

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

MISE À JOUR

CASE 1

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

CASE 2

Vous avez entré quelque chose, ce qui est hors de portée comme je l'ai mentionné ci-dessus. Je me demande vraiment ce que vous pourriez avoir essayé d'entrer. Dans mon système, il fonctionne parfaitement sans changer une seule ligne de code. Copiez simplement comme il est et essayez 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 le dit, vous avez essayé d'entrer 1.0, 2.8 etc S'il vous plaît essayer avec ce code.

Remarque: Veuillez entrer le numéro un par un, sur des lignes séparées. Je veux dire, entrez 2.7, appuyez sur Entrée, puis entrez le second numéro (par exemple 6.7).

+0

Comme je l'ai dit, je tape seulement en double valeur comme 1.0, 5.8, etc et qui affiche toujours le même message –

+0

@ TrầnTrung copier le code entier et le compiler et l'exécuter. Et, essayez de donner quelques commentaires, que vous avez essayé plus tôt. Aussi, s'il vous plaît vérifier ma ** Note ** à la fin de ma réponse. Et, laissez-moi savoir.Si vous avez la solution, alors laissez-moi savoir. – Ravi

+0

Je pense que j'ai trouvé le problème, car mon ordinateur ne reconnaît que le ',' comme pour la partie fractionnaire alors que les entrées que j'ai utilisées sont avec '.', C'est pourquoi ça ne marcherait pas. –

0

Puisque vous avez la boucle d'entrée utilisateur manuelle, après que le scanner a lu votre première entrée, il passera le chariot/retour dans la ligne suivante qui sera également lu; bien sûr, ce n'est pas ce que tu voulais.

Vous pouvez essayer cette

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

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

reader.next()

0

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

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

C'est à double retour si vous venez de saisir des chiffres comme 456. Si vous entrez dans une chaîne ou un caractère à la place, il va jeter java.util.InputMismatchException quand il essaie de faire num = reader.nextDouble() .

1

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 des parties des fractions, la fraction avec le point deviendra type String. D'où l'erreur ...

6

Au lieu d'utiliser un point, comme: 1.2, essayez de saisir comme suit: 1,2.

+0

essayez de modifier les paramètres régionaux du scanner: '.useLocale (Locale.ENGLISH)' – HoseinGhanbari

Questions connexes