web-dev-qa-db-ja.com

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

この:

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

これをテストすると、二重の数をとることができず、次のメッセージが表示されます。

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

どうすれば修正できますか?

6
Trần Trung

ここでは、 スキャナー の性質を確認できます。

double nextDouble()

次のトークンをdoubleとして返します。 次のトークンが浮動小数点数でないか範囲外の場合、InputMismatchExceptionがスローされます。

例外をキャッチしてみてください

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

[〜#〜]更新[〜#〜]

ケース1

私はあなたのコードを試してみましたが、何も問題はありません。 String valueを入力した必要があるため、このエラーが発生しています。数値を入力すると、エラーなしで実行されます。しかし、私がStringを入力すると、あなたの質問で言及したのと同じthrowと同じExceptionになります。

ケース2

入力した値は範囲外です。

あなたが何を入れようとしたのだろうと本当に思っています。私のシステムでは、1行のコードを変更することなく、完全に実行されています。そのままコピーして、コンパイルして実行してみてください。

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

あなたが言ったように、1.02.8などを入力しようとしました。このコードで試してください。

注:番号は1行に1行ずつ入力してください。つまり、2.7と入力し、Enterキーを押してから、2番目の数値を入力します(例:6.7)。

7
Ravi

1.2のようなドットを使用する代わりに、1,2のように入力してみてください。

8
linha9

手動のユーザー入力ループがあるので、スキャナーが最初の入力を読み取った後、キャリッジ/リターンが次の行にも渡されます。これも読み取られます。もちろん、それはあなたが望んでいたことではありません。

あなたはこれを試すことができます

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

または、次の呼び出しにより、次の二重入力を読み取る前にその改行を消費できます

reader.next()

2
Infinity

同じ問題が発生しました。奇妙ですが、その理由は、オブジェクトスキャナーがシステムのローカライズに応じて分数を解釈するためです。現在のローカライゼーションがコンマを使用して分数の部分を区切っている場合、ドットのある分数はString型になります。したがって、エラー...

2
user3438931

コンソールに書き込み入力を提供していますか?

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

456のような数値を入力しただけの場合、これはdoubleを返します。代わりに文字列または文字を入力した場合、num = reader.nextDouble()を実行しようとすると、Java.util.InputMismatchExceptionがスローされます。

0
chinmay.sagade