在Java中无限循环

时间:2010-02-26 15:24:01

标签: java while-loop infinite-loop

嘿那里!我正在尝试进行一些数据输入验证,但我无法弄明白。当我尝试验证输入的第一个字符是否为字母时,我正在获得无限循环。 。 。

感谢您的帮助!

public class methods
{
    public static void main(String args[]) throws IOException
    {
        String input ="";
        int qoh=0;
        boolean error=true;

        Scanner keyboard = new Scanner (System.in);

        //while (error)
        //{
            //error=true;

        while (error==true)
        {
           System.out.print("\nEnter Quantity on Hand: ");
           input = keyboard.nextLine();

           if (input.length() <1)
           {
               System.out.println("\n**ERROR06** - Quantity on hand must be between 0 and 500");
               error=true;
               System.out.println(qoh);
               System.out.println(input);
            }
            else
            {
                error=false;
            }
        }

        error = true;

        while (error==true)
        {
            if (Character.isLetter(input.charAt(0)))
            {
                System.out.println("\n**ERROR06** - Quantity on hand must be between 0 and 500");
                error=true;
                System.out.println(qoh);
                System.out.println(input);
             }
             else
             {
                 qoh = Integer.parseInt(input);
                 error=false;
              }
          }
      }
  }

4 个答案:

答案 0 :(得分:3)

你的第二个while循环中没有input = keyboard.nextLine();

您可以重构代码,以便在出现错误时仅询问新输入。就在'错误......'的系统输出之后

额外: 我实际上会做到这一点。

例如,您可以编写一个名为tryProcessLine的方法,该方法读取输入并在ok时返回true,如果有错误则返回false,而不仅仅是while(!tryProcessLine()){ }

下面的工作示例:

import java.io.IOException;
import java.util.Scanner;

public class Methods {

  private static int qoh;

  public static void main(String args[]) throws IOException {

    while (!tryProcessLine()) {
        System.out.println("error... Trying again");
    }

    System.out.println("succeeded! Result: " + qoh);

  }

  public static boolean tryProcessLine() {

    String input = "";

    Scanner keyboard = new Scanner(System.in);

    System.out.print("\nEnter Quantity on Hand: ");

    input = keyboard.nextLine();

    try {
        qoh = Integer.valueOf(input);

        if (qoh < 0 || qoh > 500) {
          System.out.println("\n**ERROR06** - Quantity on hand must be between 0 and 500");
          return false;
        } else {
          return true;
        }
    } catch (NumberFormatException e) {
        System.out.println("\n**ERROR06** - Quantity on hand must be numeric");
        return false;
    }
  }
}

答案 1 :(得分:1)

发生无限循环,因为第二个while循环反复检查字符串(input.charAt(0))中的第一个字符是否为字母。假设此检查的结果为真,则循环将永远不会终止。

您的代码可以简化为:

Integer qty = null;

while (scanner.hasNext() && qty == null) {
  String line = scanner.next();
  try {
    qty = Integer.parseInt(line);
  } catch(NumberFormatException ex) {
    System.err.println("Warning: Ignored non-integer value: " + line);
  }
}

if (qty == null) {
  System.err.println("Warning: No quantity specified.");
}

答案 2 :(得分:1)

问题出在本节:

                        while (error==true)
                        {
                            if (Character.isLetter(input.charAt(0)))
                            {
                                System.out.println("\n**ERROR06** - Quantity on hand must be between 0 and 500");
                                error=true;
                                System.out.println(qoh);
                                System.out.println(input);
                            }
                            else
                            {
                                qoh = Integer.parseInt(input);
                                error=false;
                            }
                        }

一旦你在第一个位置有一个字母,这个循环永远不会终止。它检查字母是否在第一个位置(它是),打印并重复。尝试更改为:

                            while (error==true)
                            {
                                if (Character.isLetter(input.charAt(0)))
                                {
                                    System.out.println("\n**ERROR06** - Quantity on hand must be between 0 and 500");
                                    error=false;

                                    ...

另外,还有其他一些事情:

while (error == true)可以缩短为while(error)

此外,如果输入不是整数,Integer.parseInt将抛出NumberFormatException - 你需要捕获并处理它。

另外,为什么你需要第二个循环呢?似乎只应该验证输入 - 如果是这样,你可以将这个逻辑移动到第一个循环中并消除第二个循环。仅对可能重复发生的事情使用循环(例如用户输入输入数据)。无需重复检查相同的输入。

答案 3 :(得分:0)

如果它是一个字符,你允许错误仍为= true,这导致该循环永远继续,你不会回到开头并读取另一行。

以下是一些代码可以完成您想要的并且结构更好一些。

public class ScanInfo {

  Scanner keyboard = new Scanner(System.in);

  public ScanInfo(){
    String line = getLineFromConsole();
    while(null != line && !"quit".equals(line)){
      if(isValidInput(line)){
        int validNumber = Integer.parseInt(line);
        System.out.println("I recieved valid input: "+validNumber);
      }else{
        System.out.println("\n**ERROR06** - Quantity on hand must be between 0 and 500");
      }
      line = getLineFromConsole();
    }

  }

  private boolean isValidInput(String line){
    //basic sanity
    if(null == line || line.length() < 1){
      return false;
    }


    try {
      int number = Integer.parseInt(line);

      return (number >= 0 && number <= 500);

    } catch (NumberFormatException e) {
      return false;
    }

  }


  public static void main(String[] args) {
    new ScanInfo();

  }

  public String getLineFromConsole(){
    System.out.print("\nEnter Quantity on Hand: ");
    return keyboard.nextLine();

  }

}