在输入有效之前,如何检查无效输入和循环?

时间:2014-12-30 22:41:03

标签: java list loops

我试图从用户输入中找到列表中的最小数字。我需要询问用户列表中将包含多少个数字(并且只接受正数而不是字母),然后询问他们列表中的数字是什么(仅接受数字)。如何检查并保持循环直到数字有效?

public class SmallestInt {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {


        // Initialize a Scanner to read input from the command line
        Scanner input = new Scanner(System. in );
        int totalIntegers = 1;
        int num = 0;
        int smallest = 0;
        boolean inputValid = false;

        /* Prompt the user and validate their input to ensure they've entered a positive (greater than zero) integer. Discard/ignore any other data.
         */

        while (!inputValid)

        {
            System.out.print("How many integers shall we compare? (Enter a positive integer): ");

            try {
                totalIntegers = input.nextInt();
                inputValid = true;

            } catch (NumberFormatException e) {
                System.out.println("Invalid input!");
            }


            /* Read in the candidates for smallest integer
             * Validate this input as well, this time ensuring that the user has provided a valid int (any int will do at this point) and discarding any other data
             */
            for (int ii = 1; ii <= totalIntegers; ii++) {

                // Prompt 
                System.out.print("Enter value " + ii + ": ");

                num = input.nextInt();

                if (ii == 1) smallest = num;
                else if (num < smallest) smallest = num;

            }


            // display smallest int

            System.out.println("The smallest number entered was: " + smallest);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

由于这显然是一项家庭作业/学习练习,我不会给你代码。如果您自己进行实际编码,您将了解更多信息。

使用循环嵌套修复问题后......

此代码存在三个问题:

while (!inputValid) {
    System.out.print("How many integers? (Enter a positive integer): ");
    try {
        totalIntegers = input.nextInt();
        inputValid = true;
    } catch (NumberFormatException e) {
        System.out.println("Invalid input!");
    }
}

第一个问题是您正在捕获错误的异常。 Read the javadoc

第二个问题是如果nextInt失败(由于解析整数问题),它会将扫描仪的输入光标放回到调用之前的位置。当你再次调用它时(在下一个循环迭代中),它将尝试读取相同的&#34; bad&#34;再次,再一次,......,

您必须告诉扫描仪跳过无效的输入行,以便它可以读取用户的下一次尝试。

第三个问题是你没有检查你刚读过的号码是否正确!!

最后提示:考虑使用while (true)和条件break,而不是while (condition)。我认为它提供了更优雅的解决方案。


@Kick Buttowski的解决方案通过在每次循环迭代中创建新的Scanner来处理错误的输入跳过。显然它有效...但我有一些怀疑 1 ,你可以依靠它始终工作。 IMO更好的解决方案是在整个过程中使用一个Scanner,并使用nextLine()调用来读取和丢弃字符,直到并包括行尾。


1 - 我主要担心的是当你泄漏Scanner它可能(在某些实现中)关闭终结器中的基础输入流。如果确实发生了,那么应用程序将停止接受输入。当前的实现不会这样做,但是没有明确规定(AFAIK)。

答案 1 :(得分:2)

让我们为您提供示例,以便您可以按照蓝图

进行操作

首先,我选择了while while循环,因为你需要至少问一次这个问题。

do ... while循环的语法是:

do
{
   //Statements
}while(Boolean_expression);
  

请注意,布尔表达式出现在循环的末尾,所以   循环中的语句在测试布尔值之前执行一次。

     

如果布尔表达式为true,则控制流会跳回   要做,,循环中的语句再次执行。这个流程   重复,直到布尔表达式为假。

接下来,你需要看看当输入正确时你如何能够满足boolean_experssion,所以你可以停止循环,或者如果它是错误的,你就会不断提问。

我真正喜欢的方式是使用哨兵价值,因为使用break关键字真的让我感到害怕。

  

在编程中,一个用于终止循环的特殊值。该   通常选择哨兵值以便不是合法数据   循环将遇到并尝试执行的值。对于   例如,在计算非负整数的循环算法中,   价值&#34; -1&#34;可以像计算一样设置为sentinel值   永远不会将这个价值作为合法的处理输出。

因此,当输入正确时,您可以更改i的值,这样您就可以停止循环或其他方式,显示消息并反复询问问题,直到使用正确答案为止。

<强>代码

    int i = 0;
    Scanner input = new Scanner(System.in);
    while (i == 0) {
        System.out.println("Enter number zero plz");
        int result = input.nextInt();
        if(result == 0 ){
            System.out.println("I entered right number");
            i = 1;
        } else
            System.out.println("you entered the wrong number \nplz try again");
    }

<强>输出

enter image description here

答案 2 :(得分:1)

你的while循环在阻止用户前进方面确实没有为你做任何事情。你可以点击for循环,因为它在你的循环中。更改while循环和for循环,以便for循环在while循环之外。

while (!inputValid)
{
    System.out.print("How many integers shall we compare? (Enter a positive integer): ");

    try {
        totalIntegers = input.nextInt();
        inputValid = true;

    } catch (NumberFormatException e) {
        System.out.println("Invalid input!");
    }
} // End while //

/* Read in the candidates for smallest integer
 * Validate this input as well, this time ensuring that the user has provided a valid int (any int will do at this point) and discarding any other data
 */
for (int ii = 1; ii <= totalIntegers; ii++) {

    // Prompt 
    System.out.print("Enter value " + ii + ": ");

    num = input.nextInt();

    if (ii == 1) smallest = num;
    else if (num < smallest) smallest = num;

} // End for //