要求用户在不关闭程序的情况下输入双精度而不是字符串

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

嗨,我写了这段代码,要求用户输入一个数字:

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;
}

万一用户不小心输入了一个String,我该如何在不关闭程序的情况下告诉他输入一个数字呢?谢谢你

一个快速但 "dirty" 的解决方案是使用 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;
}

用户总是输入字符串; Scanner#nextDouble() 是一种将字符串输入解释为 double.

的便捷方法

编写一个持续读取输入直到输入双精度值的方法:

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;
}

然后从循环中调用它:

score[a] = readDouble(ip);

你应该捕获当用户没有输入双精度时抛出的异常,要求用户再次尝试插入双精度,并在你试图读取双精度的那一行继续循环,直到用户真正输入一个双。或者,当用户输入双精度时,您可以使用 while(true)break 语句,这可能更简洁,但更易读。

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;
}