简体   繁体   中英

Ask user to input a double instead of a String without making the program shutdown

Hy, I wrote this piece of code where I'm asking the user to input a number:

public static double[] getscores()
{
int numscores=8;
double score[] = new double[numscores];
for (int a=0;a<numscores;a++)
{
Scanner ip=new Scanner(System.in);
System.out.println("Enter a score");
score[a]=ip.nextDouble();
}
return score;
}

In the eventuality where the user accidentally enters a String, how am I supposed to tell him to input a number without making the program shut down? Thanks You

You should catch the exception thrown when the user doesn't input a double , ask the user to try again inserting a double, and keep looping at that line where you are trying to read a double, until the user actually inputs a double. Alternatively, you can use while(true) and break statements instead when the user inputs a double, perhaps that is cleaner, but this is more readable.

public static double[] getscores() {
    int numscores = 8;
    double score[] = new double[numscores];
    for (int a = 0; a < numscores; a++) {
        Scanner ip = new Scanner(System.in);
        System.out.println("Enter a score");

        boolean isDouble = false;
        do {
            try {
                score[a] = ip.nextDouble();
                isDouble = true;
            } catch (InputMismatchException ex) {
                System.out.println("You didn't enter a double, please try again");
            }
        } while (!isDouble);

    }
    return score;
}

The user is always entering a String; Scanner#nextDouble() is a convenience method to interpret String input as a double .

Write a method that keeps reading input until a double is entered:

static double readDouble(Scanner scanner) {
    double score;
    while (true) {
        System.out.println("Enter a score");
        String input = scanner.nextLine();
        try {
            score = Double.parseDouble(input);
            break;
        } catch (NumberFormatException e) {
            System.out.println("'" + input + "' is not a valid score");
        }
    }
    return score;
}

then call it from your loop:

score[a] = readDouble(ip);

A quick but "dirty" solution would be by using try-catch:

public static double[] getscores() {
    int numscores = 8;
    double score[] = new double[numscores];
    for (int a = 0; a < numscores; a++) {
        Scanner ip = new Scanner(System.in);
        System.out.println("Enter a score");
        try{
            score[a] = ip.nextDouble();
        } catch(InputMismatchException ime) {
            System.out.println("Wrong input");
            a--;
        }
    }
    return score;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM