while循环在执行前执行一次

时间:2014-01-04 01:58:21

标签: java loops input while-loop

这是一个很难研究的问题,所以请原谅我这是否重复。

基本上,我有一个while循环,只有在用户扫描的代码是整数时才会中断。我通过尝试Integer.parseInt(integer)来检查这一点,并且只有在没有抛出NumberFormatException时才会中断循环。

我的问题是,当循环第一次执行时,抛出异常,没有任何用户输入。

这是我的代码:

Scanner input = new Scanner(System.in);

while (true) 
{
    System.out.print("Please scan barcode: ");
    int inCode = 0;

    try
    {
        inCode = Integer.parseInt(input.next());
    }
    catch (NumberFormatException e)
    {
        System.out.println("Numbers only, please.");
    }

    if (inCode != 0) {
    // Do Stuff
    } else {
    System.out.println("Code can't be zero!");
    }
}

应该发生什么,是这样的:

  

请扫描条形码:// And here they enter the barcode

但反过来会发生这种情况:

  

请扫描条形码:仅限数字。
  请扫描条形码:

修改

根据Bohemian的回答,我在代码中添加了continue关键字。这解决了这个问题,但只有一半。根据我提出问题的人的要求(有充分的理由,正如我现在所看到的)我将为你们发布一个SSCCE。我将删除与数据库接口的方法,但只保留有问题的路径:根据代码创建一个新帐户。

Scanner input = new Scanner(System.in);

while (true)
{
        System.out.print("Please scan barcode: ");
        int inCode = 0;

        try
        {
            inCode = Integer.parseInt(input.next());
        }
        catch (NumberFormatException e)
        {
            System.out.println("Numbers only, please.");
            continue;
        }

        if (true) // Here it checks if an account associated with the code entered exists in the database. Because I'm having issues when it creates a new account, I've made this true.
        {
            System.out.println("No account associated with that code! Create one?");
            System.out.print("(yes/no): ");
            String answer = input.next();
            if (answer.equalsIgnoreCase("yes"))
            {
                System.out.println("Alright.");
                System.out.print("Please enter a name: ");
                String name = input.next();
                System.out.print("Alright. Now I'll add that to the database... ");

                // Here I add that to the database. Omitted.

                System.out.println("Done! Please scan again to interface.");
            }
            else if (answer.equalsIgnoreCase("no"))
            {
                System.out.println("Okay then.");
            }
            else
            {
                System.out.println("Defaulting to no.");
            }
        }
}
// I still haven't written the code to interface with the account.

现在发生了什么,它说(在第一次迭代中)

  

请扫描条形码:

但是,在完成添加帐户的过程后,它再次循环并说:

  

请扫描条形码:仅限数字。
  请扫描条形码:

修改

请注意,所有内容都在while循环中,因此当用户完成的所有内容完成后,它将返回到:

  

请扫描条形码:

5 个答案:

答案 0 :(得分:2)

我认为你想要的是:

Scanner input = new Scanner(System.in);
while (true) {

    System.out.print("Please scan barcode: ");
    int inCode = 0;

    try {
        inCode = Integer.parseInt(input.next());
        if (inCode != 0) {
            // Do Stuff
            break;
        }
    } catch (NumberFormatException e) {
        System.out.println("Numbers only, please.");
    }
}

答案 1 :(得分:1)

您拥有的代码可以更好地构建,这样可以更清楚地发现正在发生的事情并更容易追踪问题。您只想循环数据输入 - 所以只需循环数据输入:

int inCode = 0;
while (true) {
    System.out.print("Please scan barcode: ");

    try {
        inCode = Integer.parseInt(input.next());
        break;
    } catch (NumberFormatException e) {
        System.out.println("Numbers only, please.");
    }
}

// Do stuff

您应该考虑使用scanner.hasNextInt()scanner.nextInt()而不是scanner.next()。这也将避免使用像这样的例外。通常使用Exceptions控制程序流是一个坏主意 - 实际上它们应该用于处理特殊情况。 Integer.parseInt没有给你任何替代方案,但扫描仪会这样做。

答案 2 :(得分:1)

编辑完成后,很清楚问题是什么:你的while (true)循环中没有break语句,所以它会一直循环。

就个人而言,我建议将大部分代码移出循环,只保留条形码解析代码,例如:像这样:

int inCode;
while (true) {
    System.out.print("Please scan barcode: ");   
    try {
        inCode = Integer.parseInt(input.next());
        if (inCode == 0) {
            System.out.println("Code can't be zero!");
        } else {
            break;  // we got a valid barcode! end the loop and move on...
        }
    } catch (NumberFormatException e) {
        System.out.println("Numbers only, please.");
        // no need for a "continue" here, since the loop will restart anyway
    }
}

// rest of the code here...

或甚至可能:

int inCode;
while (true) {
    System.out.print("Please scan barcode: ");   
    try {
        inCode = Integer.parseInt(input.next());
    } catch (NumberFormatException e) {
        System.out.println("Numbers only, please.");
        continue;
    }
    if (inCode == 0) {
        System.out.println("Code can't be zero!");
        continue;
    }
    break;  // we have a valid barcode! end the loop and move on...
}

// rest of the code here...

答案 3 :(得分:0)

如果输入错误,我只会continue循环,然后您不需要稍后测试它:

while (true) {
    System.out.print("Please scan barcode: ");
    int inCode = 0;

    try {
        inCode = Integer.parseInt(input.next());
    } catch (NumberFormatException e) {
        System.out.println("Numbers only, please.");
        continue; // ADDED THIS LINE
    }

    // Do Stuff with inCode
}

请注意,通过输入后的代码测试为零,可以将零作为有效输入排除。此代码允许任何数字,包括零。小点,但不用担心边缘情况。

答案 4 :(得分:0)

你可以试试这个

String in=null;
while (true) {
    System.out.print("Please scan barcode: ");
    int inCode = 0;
    try {
        in= input.next();
        inCode=Integer.parseInt(in);
    } catch (NumberFormatException e) {
        System.out.println("Numbers only, please.");
    }

if (inCode != 0) {
// Do Stuff
} else {
// Repeat loop
}

或者您可以通过Scanner对象直接读取整数,而不是使用Integer.parseInt()方法。

int inCode=0;
while(true) {
  System.out.print("Please scan barcode : ");
  inCode=input.nextInt();

  if(inCode!=0){ //do stuff }
  else { //Repeat Loop }
 }