Бесконечный цикл цикла в Java - PullRequest
2 голосов
/ 26 февраля 2010

Привет! Я пытаюсь сделать некоторые проверки ввода данных, но я не смог понять это. Я получаю бесконечный цикл while, когда пытаюсь проверить, является ли первый введенный символ буквой. , , .

Спасибо за вашу помощь!

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 ]

3 голосов
/ 26 февраля 2010

В вашем втором цикле while нет input = keyboard.nextLine();.

Вы можете изменить свой код, чтобы запрашивать новый ввод только в случае ошибки. Так что сразу после sysout «ОШИБКА ...»

Дополнительно: Я бы на самом деле сделал это иначе. «Error = true» в начале немного сбивает с толку, потому что не может быть ошибки.

Например, вы можете написать метод tryProcessLine, который читает входные данные и возвращает 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 голос
/ 26 февраля 2010

Проблема в этом разделе:

                        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, если ввод не является целым числом - вам нужно поймать и обработать это.

Кроме того, зачем вам вообще нужен второй цикл? Кажется, что это только для проверки ввода - если это так, вы можете переместить эту логику в первый цикл и исключить второй. Используйте циклы только для вещей, которые должны повторяться (например, пользователь вводит входные данные). Нет необходимости повторно проверять один и тот же вход.

1 голос
/ 26 февраля 2010

Бесконечный цикл происходит потому, что второй цикл while многократно проверяет , является ли первый символ в строке (input.charAt(0)) буквой. Если предположить, что результат этой проверки равен true, цикл никогда не прекратится.

Ваш код может быть упрощен до чего-то вроде:

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.");
}
0 голосов
/ 26 февраля 2010

Если это символ, вы допускаете ошибку по-прежнему = 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();

  }

}
...