2010-02-26 3 views
2

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

Благодарим за помощь!

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; 
       } 
      } 
     } 
    } 
+2

примечание стороны: while (error == true) можно записать как while (ошибка) – basszero

+0

Это домашнее задание? –

ответ

3

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

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

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

Вы могли бы, например, написать метод, называемый tryProcessLine, который считывает входные данные и возвращает истину, если все в порядке, и ложь, если произошла ошибка, и не просто сделать что-то вроде 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; 
    } 
    } 
} 
+0

-1: Это не причина бесконечного цикла. Первый цикл предназначен для чтения первой непустой строки, тогда как я предполагаю, что второй цикл должен проверять, что эта строка содержит только числовые символы (а не читать другую строку ввода). – Adamski

+0

Я предполагаю, что он хочет получить новый вход, когда произойдет ошибка во втором цикле. В противном случае второй цикл не должен быть циклом. Поскольку теперь, когда во втором цикле есть «ошибка», новый запрос не запрашивается, а «error == true» всегда будет true ... – Fortega

+0

Я предполагаю, что он хочет прочитать первую непустую строку введите и попытайтесь разобрать его в целое число. Я не думаю, что OP требует двух циклов. – Adamski

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."); 
} 
0

Если персонаж, вы позволяете ошибка по-прежнему = верно, что является причиной, что петля продолжать вечно, ты никогда не возвращаясь к началу и читая другую строку.

Вот какой код, который делает то, что вы хотите, и структурирован немного лучше.

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(); 

    } 

} 
+0

Почему вы анализируете ввод в целое число дважды? – Adamski

+0

«quit»! = Строка должна быть! «Quit» .equals (line) – Fortega

+0

Я анализирую целое число дважды, потому что я ленив и инкапсулировал его неправильно. Фортега: сделал изменения. – Kylar

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

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

Смежные вопросы