これまでのところ私はこれを持っています:
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
どうすれば修正できますか?
ここでは、 スキャナー の性質を確認できます。
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.0
、2.8
などを入力しようとしました。このコードで試してください。
注:番号は1行に1行ずつ入力してください。つまり、2.7
と入力し、Enterキーを押してから、2番目の数値を入力します(例:6.7
)。
1.2のようなドットを使用する代わりに、1,2のように入力してみてください。
手動のユーザー入力ループがあるので、スキャナーが最初の入力を読み取った後、キャリッジ/リターンが次の行にも渡されます。これも読み取られます。もちろん、それはあなたが望んでいたことではありません。
あなたはこれを試すことができます
try {
// ...
} catch (InputMismatchException e) {
reader.next();
}
または、次の呼び出しにより、次の二重入力を読み取る前にその改行を消費できます
reader.next()
同じ問題が発生しました。奇妙ですが、その理由は、オブジェクトスキャナーがシステムのローカライズに応じて分数を解釈するためです。現在のローカライゼーションがコンマを使用して分数の部分を区切っている場合、ドットのある分数はString型になります。したがって、エラー...
コンソールに書き込み入力を提供していますか?
Scanner reader = new Scanner(System.in);
num = reader.nextDouble();
456のような数値を入力しただけの場合、これはdoubleを返します。代わりに文字列または文字を入力した場合、num = reader.nextDouble()を実行しようとすると、Java.util.InputMismatchExceptionがスローされます。