0

コンソールアプリケーションでユーザーからのすべての入力を処理するメソッドを作成しようとしています。このメソッドを合計5回呼び出します。初めての状態は

a)数値は正であり、実数値(double)である必要があります

次の4回の状態は

b)数値は1より大きくなければなりません

これが私の方法です:

private static double numChk(int errNum) {

    final String[] ERROR_MESSAGE = {
            "\nPlease enter only positive, real-valued numbers",
            "\nPlease enter only positive numbers greater than 1" };
    Scanner in = new Scanner(System.in);
    double tempData;

    while (!in.hasNextDouble()) {
        System.out.println(ERROR_MESSAGE[errNum]);
        System.out.print("  Please try again: ");
        in.next();
    }
    tempData = in.nextDouble();

    // in.close();
    return tempData;
}

これは、このメソッドの呼び出し例です。

 do {
        System.out
                .println("Please enter only positive, real-valued numbers");
        System.out.print("  Enter a constant: ");
        mu = numChk(0);
    } while (mu <= 0);

「//in.close();」に注意してください 私が書いた方法で。スキャナーを閉じなくても、この方法は正常に機能します。ただし、私の割り当てでは、開いているすべての入力ストリームを確実に閉じる必要があります。メソッドの入力ストリームを閉じて再度開くと、NoSuchElementExceptionが発生します。これらすべてをメインメソッドに入れて、最後に入力を閉じることができることはわかっていますが、これを行う方法(入力検証、複数回)があり、入力ストリーム。

4

3 に答える 3

3

in.close() を呼び出すと、System.in も閉じられます。次に新しい Scanner を使用しようとすると、閉じられた System.in を使用しようとするため、そこから読み取ろうとすると例外が発生します。

参照: Scanner.next() を使用してテキスト入力を取得する

于 2012-09-13T16:12:09.007 に答える
1

メソッドで in.close() を呼び出す場合、それが最後の入力かどうかを判断する何らかの方法が必要です。

スキャナーをメイン メソッドに配置し、スキャナーをメソッドに渡し、すべての入力が完了したらスキャナーを閉じることをお勧めします。

私が疑っているのは、ファイルからのようにパイプで入力を送信していることです。最初のスキャナはすべての入力をバッファリングし、それを閉じて再度開くと、最初のスキャナにバッファリングされたデータが失われます。保証はできませんが、こんな感じです。

于 2012-09-13T15:53:13.010 に答える
0

while ループの後、呼び出しを試みますが、この行までに入力がない可能性があります。

 tempData = in.nextDouble();
于 2012-09-13T15:52:25.520 に答える