9

これまでのところ、私はこれを持っています:

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

これを修正するにはどうすればよいですか?

4

5 に答える 5

11

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

于 2014-09-24T15:24:37.157 に答える
9

ここでは、 Scannerの性質を確認できます。

double nextDouble()

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

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

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

アップデート

ケース1

私はあなたのコードを試しましたが、何も問題はありません。valueを入力したに違いないStringため、そのエラーが発生しています。数値を入力すると、エラーなく実行されます。しかし、あなたが質問で述べた のと同じように入力Stringしたら。throwException

ケース 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.0しよ2.8うとしました。このコードで試してください。

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

于 2012-12-25T04:04:44.393 に答える
2

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

これを試すことができます

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

または、次の二重入力を呼び出す前に、そのキャリッジ リターンを消費することもできます。

リーダー.次()

于 2012-12-25T04:04:07.810 に答える
0

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

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

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

于 2012-12-25T04:06:36.737 に答える