3

私の検証方法では、ユーザーが10進数の代わりに文字を入力した場合にエラーメッセージを出力したいのですが、このメソッドはコンソールにエラーメッセージを出力することを正確に行いますが、たとえば「dfdff」と入力した場合は2回出力します小数点の代わりに、
「エラー、無効な数値です。再試行してください」と表示されます。

「エラー、無効な番号です。再試行してください」

ユーザーが間違った値を入力するたびにエラーメッセージを出力するにはどうすればよいですか???

 public static double getVaildSubtotal(Scanner sc)
{

    double subtotal = 0.0;
    boolean isValid = false;
    while (isValid == false)
    {
       if (sc.hasNextDouble())
       {
           subtotal = sc.nextDouble();
           isValid = true;
       }
       else
       {
           System.out.println("Error! Invalid decimal value. Try again.");
       }
       sc.nextLine();

       if (isValid == true && subtotal <= 0)
       {
           System.out.println("Error! Number must be greater then 0.");
           isValid = false;
       }
       else if (isValid == true && subtotal >= 10000)
       {
          System.out.println("Error! Number must be less then 10000.");
           isValid = false; 
       }

    }

    return subtotal;
}
4

3 に答える 3

1

これはおそらく、ScannerクラスのnextDouble()メソッドが改行を「食べない」ためです。これにより、および類似のメソッドnextLine()を介してプリミティブが読み込まれた後、次の行に移動する前にメソッドが空の行を返す可能性があります。nextDouble()

これはいくつかのトリッキーな結果につながる可能性がありますが、最も簡単な方法は、ここScannerにエクストラを挿入して、改行を明示的に処理することです。nextLine()

if (sc.hasNextDouble()) {
    subtotal = sc.nextDouble();
    sc.nextLine();
    isValid = true;
}

スキャナーの区切り文字が改行と一致していない場合、これにより予期しない結果が生じる可能性があることに注意してください。この場合、誤って複数の入力をスキップする可能性があります。とにかく、通常は改行で分割したいので、次のように、作成時にスキャナーの区切り文字を変更することにより、より永続的なソリューションを作成できます。

Scanner sc = new Scanner(System.in);
sc.useDelimiter("[\r\n]+");

nextLine()このソリューションを使用すると、余分な改行が無視されるため、余分な呼び出しを使用する必要がなくなります。ただし、このシステムは空行入力にも応答しません。空行入力はその区切り文字で単にスキップされます。それらを処理したい場合はnextLine()、安全のためにこの区切り文字とともに追加の修正を使用できます。

sc.useDelimiter("\r\n|[\r\n]");
于 2013-02-13T05:37:57.837 に答える
0

sc.nextLine();入力を行った後、改行を生成するEnterキーを押すため、2回呼び出す必要があります。
そのために、もう1つ追加することで、この余分な改行を処理できますsc.nextLine();

于 2013-02-13T05:40:19.713 に答える