web-dev-qa-db-ja.com

スキャナーを使用して有効なintのみを入力として受け入れる方法

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

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などを入力すると、プログラムが終了するためです。

23
John

Scanner.hasNextInt() を使用します。

nextInt()メソッドを使用して、このスキャナーの入力内の次のトークンがデフォルト基数のtrue値として解釈できる場合、intを返します。スキャナーは入力を通過しません。

以下に例を示します。

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

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

関連する質問

31
  1. num2がnum1より大きくなければならない場合、条件num2 <num1はnum2 <= num1でなければなりません
  2. kbオブジェクトが何なのかわからないので、Stringを読んでからtrying Integer.parseInt()を読んで、catch例外がなければ、場合は、num2をInteger.MIN_VALUEに設定し、例で同じタイプのロジックを使用して、新しい番号を読み取ります。
4
Ledhund

これは動作するはずです:

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

    }
}
3
aioobe

これを試して:

    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では\は特殊文字であるため、エスケープする必要があります。

2
npinti

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

例外に対処したくない場合、それは正しいと思います。

0
LB40

入力はたった1つのシンボルであるため、Character.isDigitがニーズに完全に合っていることがわかります。もちろん、このkbオブジェクトに関する情報はありませんが、Java.util.Scannerインスタンスである場合に備えて、コマンドライン入力にJava.io.InputStreamReaderを使用することもお勧めします。以下に例を示します。

Java.io.BufferedReader reader = new Java.io.BufferedReader(new Java.io.InputStreamReader(System.in));
try {
  reader.read();
}
catch(Exception e) {
  e.printStackTrace();
}
reader.close();
0