Waarom krijg ik inputmismatchexception?

Tot nu toe heb ik dit:

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

en dit:

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

Wanneer ik dit test, kan het geen dubbel nummer nemen en ik kreeg dit bericht:

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

Hoe repareer ik dit?


Antwoord 1, Autoriteit 100%

Hier kunt u de aard van Scanner :

Double NextDouble ()

Retourneert het volgende token als een dubbel. Als het volgende token geen drijver is of
is buiten bereik, inputmismatchexception wordt gegooid.

Probeer de uitzondering te vangen

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

UPDATE

GEVAL 1

Ik heb je code geprobeerd en er is niets mis mee. Je krijgt die foutmelding omdat je String-waardemoet hebben ingevoerd. Als ik een numerieke waarde invoer, wordt deze zonder fouten uitgevoerd. Maar zodra ik Stringheb ingevoerd, throwdezelfde Exceptiondie je in je vraag hebt genoemd.

GEVAL 2

Je hebt iets ingevoerd dat buiten bereikis, zoals ik hierboven heb vermeld.

Ik vraag me echt af wat je had kunnen proberen in te voeren. In mijn systeem werkt het perfect zonder een enkele regel code te veranderen. Kopieer gewoon zoals het is en probeer het te compileren en uit te voeren.

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

Zoals u zei, heeft u geprobeerd u 1.0, 2.8ENTE ENKEL IN TEUBELEN te betreden. Probeer met deze code.

Opmerking: Voer nummer één voor één in, op afzonderlijke regels. Ik bedoel, voer 2.7in, druk op Enter en voer vervolgens het tweede nummer in (bijvoorbeeld 6.7).


Antwoord 2, Autoriteit 111%

In plaats van een punt te gebruiken, zoals: 1.2, probeer deze in te voeren: 1,2.


Antwoord 3, Autoriteit 22%

Aangezien u de handmatige gebruikersinvoerlus hebt, nadat de scanner uw eerste invoer heeft gelezen, passeert deze het vervoer / terugkeer in de volgende regel die ook zal worden gelezen; Dat is natuurlijk niet wat je wilde.

U kunt dit proberen

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

of als alternatief kunt u consumeren dat koets rendement voordat u uw volgende dubbele invoer leest door

te bellen

lezer.next ()


Antwoord 4, Autoriteit 22%

Ik heb hetzelfde probleem tegengekomen.
Vreemd, maar de reden was dat de objectscanner fracties interpreteert, afhankelijk van het lokaliseren van het systeem.
Als de huidige lokalisatie een komma gebruikt om delen van de fracties te scheiden, zal de fractie met de punt in typekring veranderen.
Vandaar de fout …


Antwoord 5

Verzendt u write-invoer aan de console?

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

Dit is retour-double als u net nummer zoals 456 invoert.
Als u in plaats daarvan een tekenreeks of teken invoert, wordt java.util.InputMismatchException gegenereerd wanneer het probeert num = reader.nextDouble() .

Other episodes