检查输入是否是while循环中的数字

时间:2015-11-28 22:06:40

标签: java input numbers

我开始使用Java编写代码(之前从未这样做过),我对输入验证感到头疼。

我需要在用户输入0到1000之间的数字时,while循环不断执行。这很好。问题是我想检查他输入一个数字,如果他没有,那么while循环应该继续执行并等待下一个输入。到目前为止,我的代码只在输入非数字的东西时抛出InputMismatchException,我看不出原因。

这是我的代码:

Scanner score = new Scanner(System.in);
    int i = 0;
    while (i < 1000000) {
        System.out.print("Insert the new score: ");
        if (score.hasNextInt()) {
            i = score.nextInt();
            if (i > 0) {
                if (i < 200000) {
                    // do something
                } else if (i < 500000) {
                    // do something
                } else if (i < 700000) {
                    // do something
                } else if (i < 100001) {
                    // do something
                }
            } else if (i < 0) {
                // do something else
            }
        } else {
            System.out.print("The score should be a number.");
            i = score.nextInt();
        }
    }

5 个答案:

答案 0 :(得分:1)

else{
    System.out.print("The score should be a number.");
    i = score.nextInt(); //<---problem
}

您知道输入不是数字,因此您不应该尝试使用int将其读作nextInt()。所以要使用无效数据

答案 1 :(得分:0)

您收到此错误是因为您告诉Scanner获取整数,即使用户未输入整数也是如此。您需要接受所有输入(通过String)并自行进行验证。

我已修改您的代码以将输入作为字符串(Scanner#nextLine),然后尝试更新分数。

Scanner score = new Scanner(System.in);
int i = 0;
while (i < 1000000) {
    System.out.print("Insert the new score: ");
    if (score.hasNext()) {
        final String input = score.nextLine();
        try {
            i = Integer.parseInt(input);
        } catch (final Exception e) {
            System.out.print("The score should be a number.");
            continue;
        }
    }
    if (i>0) {
        if (i<200000) {
            //do something
        }
        else if (i<500000) {
            //do something
        }
        else if (i<700000) {
            //do something
        }
        else if (i<100001) {
            //do something
        }
    } else if (i<0) {
        //do something else
    }
}

请注意,continue;语句将无限期地询问用户输入整数,直到用户输入,就像您在问题中所要求的那样。

答案 2 :(得分:0)

在你的最后一个else子句中,你调用score.nextInt()虽然你知道下一个数字不是int。这就是你得到例外的原因。只需用以下内容替换else:

else {
    System.out.print("The score should be a number.");
    score.nextLine(); //This is the line you need to change
}

score.nextLine();将安全地使用下一行输入,并让你回到循环中。

答案 3 :(得分:-1)

您需要将输入语句包装在try / catch块中并捕获InputMisMatchException。由于在Scanner中使用期望整数的nextInt(),因此发生InputMisMatchException。

Scanner input = new Scanner(System.in);
int i = 0;
do {
    try {
        System.out.print("Enter integer ");
        i = input.nextInt();
    } catch (InputMismatchException e) {
       //anything but integer gets caught here.
        System.out.print("Please enter only integer.");
    }
    //necessary to take the cursor back to start of line, clear the buffer
     input.nextLine();

} while (i < 1000000);

上面的代码示例演示了如何捕获InputMisMatchException。

我注意到您在代码中使用了input.hasNextInt(),而您只需要在代码的else块中替换以下内容。

i = score.nextInt()

score.nextLine(); 

如其他答案所述,这句话将清除等待下一次输入的缓冲区。例外是由于score.nextInt(),替换应该修复它。

答案 4 :(得分:-1)

您可能希望使用try-catch块包装内容。

Scanner score = new Scanner(System.in);
int i = 0;
while (i < 1000000){
try{
    System.out.print("Insert the new score: ");
    if (score.hasNextInt()){
    i = score.nextInt();
    if (i>0){
        if (i<200000){
            do something
        }
        else if (i<500000){
            do something
        }
        else if (i<700000){
            do something
        }
        else if (i<100001){
            do something
        }
    }else if (i<0){
        do something else
    }
    }else{
        System.out.print("The score should be a number.");
        i = score.nextInt();
    }
}catch(Exception e){}
}