4

ちょっと、そこ!データ入力の検証を行おうとしていますが、理解できませんでした。入力された最初の文字が文字であるかどうかを検証しようとすると、無限の 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

4 に答える 4

4

input = keyboard.nextLine();2 番目の while ループがありません。

エラーが発生した場合にのみ新しい入力を要求するようにコードをリファクタリングできます。'ERROR...' の sysout の直後

おまけ:実際にはこれを別の方法で行います。最初の 'error = true' は、エラーではない可能性があるため、少し混乱します。

たとえば、入力を読み取り、OK の場合は true を返し、エラーが発生した場合は false を返す 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;
    }
  }
}
于 2010-02-26T15:27:11.820 に答える
1

無限ループが発生するのは、2 番目の 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.");
}
于 2010-02-26T15:29:10.657 に答える
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.parseInta をスローします。これをキャッチして処理する必要があります。NumberFormatException

また、なぜ 2 番目のループが必要なのですか? 入力を検証することだけが想定されているようです-そうであれば、このロジックを最初のループに移動して、2番目のループを削除できます。ループは、繰り返し発生する必要がある場合 (ユーザーが入力データを入力する場合など) にのみ使用してください。同じ入力を繰り返し確認する必要はありません。

于 2010-02-26T15:32:02.670 に答える
0

それが文字の場合、エラーを still = 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();

  }

}
于 2010-02-26T15:29:30.800 に答える