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

Java 要求用户在不关闭程序的情况下输入双精度字符而不是字符串,java,string,double,shutdown,Java,String,Double,Shutdown,Hy,我写了一段代码,要求用户输入一个数字: 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();

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

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;
}
publicstaticdouble[]getscores()
{
int numcores=8;
双倍得分[]=新的双倍[numscores];
对于(int a=0;a而言,快速但“脏”的解决方案是使用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;
}
publicstaticdouble[]getscores(){
int numcores=8;
双倍得分[]=新的双倍[numscores];
对于(int a=0;a
用户总是在输入字符串;
Scanner#nextDouble()
是一种将字符串输入解释为
双精度的方便方法

编写一个方法,在输入双精度之前一直读取输入:

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
语句,当用户输入一个double时,这可能更干净,但可读性更强

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;
}
publicstaticdouble[]getscores(){
int numcores=8;
双倍得分[]=新的双倍[numscores];
对于(int a=0;a
阅读Java中的try…catch。这不起作用。将异常用于流控制是个坏主意。请改用
hasNextDouble()
。但它不起作用的原因是
nextDouble()
在失败时不会使用坏令牌,因此它将永远循环。您还应该在循环内创建
扫描仪
。它在InputMismatchException上显示一个错误,说明:找不到符号类InputMismatcheException@AmadouToure您需要导入
java.util.InputMismatchException
@Amadou Toure:它可能会像请记住,这只是一个快速而肮脏的黑客攻击。您不应该在循环中构造扫描仪。