27

私は小さなプログラムをより堅牢にしようとしていますが、そのための助けが必要です。

Scanner kb = new Scanner(System.in);
int num1;
int num2 = 0;

System.out.print("Enter number 1: ");
num1 = kb.nextInt();

while(num2 < num1) {
    System.out.print("Enter number 2: ");
    num2 = kb.nextInt();
}
  1. 数値 2 は数値 1 より大きくなければなりません

  2. また、ユーザーが数字の代わりに文字を入力した場合、プログラムが自動的にチェックして無視するようにします。現在、ユーザーがたとえばr数字の代わりに入力すると、プログラムは終了するためです。

4

6 に答える 6

36

使用Scanner.hasNextInt()

このスキャナーの入力の次のトークンが、メソッドを使用してデフォルトの基数trueの値として解釈できるかどうかを返します。スキャナーは入力を超えて進みません。intnextInt()

説明するスニペットは次のとおりです。

Scanner sc = new Scanner(System.in);
System.out.print("Enter number 1: ");
while (!sc.hasNextInt()) sc.next();
int num1 = sc.nextInt();
int num2;
System.out.print("Enter number 2: ");
do {
    while (!sc.hasNextInt()) sc.next();
    num2 = sc.nextInt();
} while (num2 < num1);
System.out.println(num1 + " " + num2);

parseInt心配する必要はありませんNumberFormatExceptionhasNextXXXメソッドは入力を超えて進まないためnext()、上記のように「ガベージ」をスキップする場合は呼び出す必要がある場合があることに注意してください。

関連する質問

于 2010-05-26T12:44:25.427 に答える
4
  1. num2 が num1 より大きくなければならない場合、条件 num2 < num1 は num2 <= num1 でなければなりません
  2. kb オブジェクトが何であるかわからない場合は、a を読んでStringからtryingInteger.parseInt()を読みます。例外がない場合catchは数値です。例外がある場合は、num2 を Integer.MIN_VALUE に設定して同じものを使用することにより、新しいものを読み取ります。あなたの例のロジックのタイプ。
于 2010-05-26T12:26:10.293 に答える
3

これはうまくいくはずです:

import java.util.Scanner;

public class Test {
    public static void main(String... args) throws Throwable {
        Scanner kb = new Scanner(System.in);

        int num1;
        System.out.print("Enter number 1: ");
        while (true)
            try {
                num1 = Integer.parseInt(kb.nextLine());
                break;
            } catch (NumberFormatException nfe) {
                System.out.print("Try again: ");
            }

        int num2;
        do {
            System.out.print("Enter number 2: ");
            while (true)
                try {
                    num2 = Integer.parseInt(kb.nextLine());
                    break;
                } catch (NumberFormatException nfe) {
                    System.out.print("Try again: ");
                }
        } while (num2 < num1);

    }
}
于 2010-05-26T12:34:51.133 に答える
2

これを試して:

    public static void main(String[] args)
    {
        Pattern p = Pattern.compile("^\\d+$");
        Scanner kb = new Scanner(System.in);
        int num1;
        int num2 = 0;
        String temp;
        Matcher numberMatcher;
        System.out.print("Enter number 1: ");
        try
        {
            num1 = kb.nextInt();
        }

        catch (java.util.InputMismatchException e)
        {
            System.out.println("Invalid Input");
            //
            return;
        }
        while(num2<num1)
        {
            System.out.print("Enter number 2: ");
            temp = kb.next();
            numberMatcher = p.matcher(temp);
            if (numberMatcher.matches())
            {
                num2 = Integer.parseInt(temp);
            }

            else
            {
                System.out.println("Invalid Number");
            }
        }
    }

文字列を に解析することもできますがint、通常、人々は例外のスローを避けようとします。

私が行ったことは、数字を定義する正規表現を定義したこと\dです。数字を意味します。符号は、+1 つ以上の数字が必要であることを意味します。\の前の余分な部分\dは、Java では\特殊文字であるため、エスケープする必要があるためです。

于 2010-05-26T12:33:15.050 に答える
0

I see that Character.isDigit perfectly suits the need, since the input will be just one symbol. Of course we don't have any info about this kb object but just in case it's a java.util.Scanner instance, I'd also suggest using java.io.InputStreamReader for command line input. Here's an example:

java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
try {
  reader.read();
}
catch(Exception e) {
  e.printStackTrace();
}
reader.close();
于 2010-05-26T12:42:46.813 に答える
0

次のトークンを文字列として取得し、この文字列を char 配列に変換して、配列内の各文字が digit であることをテストすることもできます。

例外に対処したくないのであれば、それは正しいと思います。

于 2010-05-26T12:50:23.837 に答える