0
public class Calculator
{

    public static void main(String[] args)
    {
        boolean isValid = false;
        Scanner myScanner = new Scanner(System.in);
        String customerType = null;
        System.out.print("Customer Type? (C/R) ");
        customerType = myScanner.next();
        while (isValid == false)
        {
            System.out.print("Enter Subtotal: ");

            if (myScanner.hasNextDouble())
            {
                double sobTotal = myScanner.nextDouble();
                isValid = true;
            }
            else
            {
                System.out
                        .println("Hay! Entry error please enter a valid number");
            }
            myScanner.nextLine();
        }
    }
}

こんにちは、Javaを初めて使用します。いつものように、Scannerクラスでいくつか試してみます。

スキャナーの入力を確認する方法はありますか?ご覧のとおり、上記のコードに問題があります。これは、間違ったデータを入力した後のコンソールウィンドウの出力です。数字の代わりにKKKを入力したので、このエラーメッセージが2回表示された理由を誰かに説明してもらえますか?

"this is the console" 
Customer Type? (C/R) R
Enter Subtotal: KKK
Hay! Entry error please enter a valid number
Enter Subtotal: Hay! Entry error please enter a valid number
Enter Subtotal: 
4

3 に答える 3

2

次のようにコードを変更します。

boolean isValid = false;
Scanner myScanner = new Scanner(System.in);
String customerType = null;
System.out.print("Customer Type? (C/R) ");
customerType = myScanner.next();

while (!isValid)
{
    System.out.print("Enter Subtotal: ");

    if (myScanner.hasNext())
    {
        try
        {
            double sobTotal =Double.parseDouble(myScanner.next());
            isValid = true;
        }
        catch(Exception e)
        {
            System.out.println("Hay! Entry error please enter a valid number");
        }
    }
}

を使用するScanner.nextDouble()と、改行 (または他の区切り文字) 自体は消費されないため、返される次のトークンは通常、空の文字列になります。

于 2012-07-24T14:52:29.943 に答える
1

本当の問題は、ループ構造に難読化があり、ループの各反復でスキャナーの出入りの状態を理解するのが難しくなっていることだと思います。

これが実際に起こっていることです。double ではない Scanner 内の 1 つのトークンでループに入ります。スキャナで次の double があるかどうかを で尋ねますhasNextDouble()。これは、1 つのトークンを double に変換できないため、false を返します。エラーを報告し、誤りのisValidままです。ブランチの後、scanner.next()非二重トークンを呼び出して消費します。isValid が false のままであるため、ループをレンタルします。Scanner に double next があるかどうかをもう一度尋ねます。トークンを使い果たしたため、スキャナーは空になり、この呼び出しは を返すfalseため、別のエラーを報告します。今、私たちは呼び出しますscanner.next()また。スキャナーが空になり、scanner.next() が同期メッセージ パッシング (I/O) を実装するため、スキャナーが新しいトークンを受け取るまでブロックするようになり、新しいトークンを入力するまでプログラムが停止します。コンソールにもっと入れてみてください。おそらくループを繰り返すと、別のエラーが表示されます。

達成したいことは、各ループでトークンを消費することです。そのトークンが double の場合、入力を受け入れて続行します。そうでない場合は、エラーを報告して繰り返します。代わりに、このようなことを試してみてください。スキャナーがループごとに行っていることをより明確に示す必要があります。

public class Calculator
{

    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);

        String customerType = null;

        System.out.print("Customer Type? (C/R) ");
        customerType = scan.next();

        Double test = null;
        do{
            try{
                test = scan.nextDouble();       
            }catch (InputMismatchException ime){ //will be thrown if the token we input is not a double
                System.err.println("Error Message");
            }
        }while(test == null);
    }
}

Doubleプリミティブではなくラッパー クラスを使用していることに注意してくださいdouble。はプリミティブではなくDouble、double を null に設定できるようにするためです。Object

于 2012-07-24T15:09:15.470 に答える
1

問題は、入力に double がある場合に正常に動作する scanner. nextdouble() を呼び出していることです。入力に ​​double がない場合、「KKK」であった入力は nextDouble() の呼び出しによって無視され、エラー メッセージが表示されます。次に、nextLine() を呼び出すと、同じ入力「KKK」がまだ待機中です。 「KKK」がプログラムに渡されるまでループバックしますが、それでもダブルではないため、繰り返しエラーメッセージが表示されます。

これを試して:

    boolean isValid = false;
    Scanner myScanner = new Scanner(System.in).useDelimiter("\\n");
    String customerType = null;
    System.out.print("Customer Type? (C/R) ");
    customerType = myScanner.next();
    while (!isValid)
    {
        System.out.print("Enter Subtotal: ");

        if (myScanner.hasNextDouble())
        {
            double sobTotal = myScanner.nextDouble();
            isValid = true;
        }
        else
        {
            System.out.println("Hay! Entry error please enter a valid number");

            if(myScanner.hasNext()){
              myScanner.next();
            }
        }
    }

これにより、「KKK」の無効な入力が消費され、プログラムが正常に続行されます。

于 2012-07-24T15:09:36.963 に答える