1

私のプログラムでは、ユーザーに半径の値を入力させると、プログラムは面積と周囲を出力します。

ユーザーが確実に数字を入力できるようにしたいので、hasNextDouble() メソッドを使用しました。ただし、正しく動作しているとは限りません。

以下のコードで太字にした最初の while ループをプログラムが実行すると (明らかに、コードを太字にすることはできないため、アスタリスクで囲まれたコードです)、「数値を入力してください >」という言葉が意図したとおりに表示されます。

ただし、太字で示した 2 番目の while ループ (ユーザーからの数値が正かどうかをテストする while ループ内にネストされている) をプログラムが実行すると、"Please enter a number > " が 2 回表示されます。

これらの単語が 2 回印刷される理由がわかりません。誰でも助けることができますか?

/**
 * Uses the Circle class to calculate area and perimeter of a circle based on a user-provided radius.
 * 
 * @author Brittany Gefroh
 * @version 1.0
 */

//Import the Scanner class
import java.util.Scanner;

public class CircleTest
{
public static void main (String [] args)
{
    //Initialize a Scanner object
    Scanner scan = new Scanner(System.in);

    //Create new Circle object
    Circle circle1 = new Circle();

    //Declare variables
    double input;
    String garbage;
    String answer;

    //Do/while loop answer is Y or y
    do
    {
        //Ask user for a radius value
        System.out.print("Enter a radius value > ");

        **while ( ! scan.hasNextDouble())
        {
            garbage = scan.nextLine();
            System.out.print("\nPlease enter a number > ");
        }**

        //Assign user input to the input variable
        input = scan.nextDouble();

        //Test if input is a positive number
        while (input <= 0)
        {
            //Prompt user for a new radius value
            System.out.println("Radius must be greater than 0");
            System.out.print("\nEnter a radius value > ");

            **while ( ! scan.hasNextDouble())
            {
                garbage = scan.nextLine();
                System.out.print("\nPlease enter a number > ");
            }**

            //Assign user input to the input variable
            input = scan.nextDouble();
        }

        //Run the setRadius method to change the radius
        circle1.setRadius(input);

        //Print blank space
        System.out.println("");

        //Display output
        System.out.println("The radius is " + circle1.getRadius());
        System.out.println("The area is " + circle1.getArea());
        System.out.println("The perimeter is " + circle1.getPerimeter());

        //Print blank space
        System.out.println("");

        //Ask user if he/she wants to try again
        System.out.print("Would you like to try again? Y or N > ");
        answer = scan.next();

        //Print blank space
        System.out.println("");

    }while (answer.equalsIgnoreCase("Y"));

}
}
4

1 に答える 1

2

変化する:

answer = scan.next();

に:

scan.nextLine();
answer = scan.nextLine();

おそらく、検証が添付された double を読み取るための特殊なメソッドを作成して、このコードを単純化する必要がありますか? また、これらの「空の」 nextLine() 操作がある理由を考えてみてください。これらは必要ですか?

編集...

問題は、scan.nextDouble();EOL マーカー (End Of Line) を削除しないことです。同じですscan.next();。それはあなたの問題です。EOL マーカーは while 条件によって分析され次のように表示されます。

"Please enter a number > " <immediate EOL answer which was left in scanner>
"Please enter a number > " <now we are waiting for user input>
于 2013-03-26T22:23:57.097 に答える