私は小さなプログラムをより堅牢にしようとしていますが、それに関していくらか助けが必要です。
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();
}
番号2は番号1より大きくなければなりません
また、ユーザーが数字ではなく文字を入力した場合、プログラムが自動的にチェックして無視するようにします。現在、ユーザーが数字ではなくr
などを入力すると、プログラムが終了するためです。
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);
_
parseInt
やNumberFormatException
を心配する必要はありません。 hasNextXXX
メソッドは入力を通過しないため、上記のように「ガベージ」をスキップする場合はnext()
を呼び出す必要があることに注意してください。
String
を読んでからtry
ing Integer.parseInt()
を読んで、catch
例外がなければ、場合は、num2をInteger.MIN_VALUEに設定し、例で同じタイプのロジックを使用して、新しい番号を読み取ります。これは動作するはずです:
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);
}
}
これを試して:
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では\
は特殊文字であるため、エスケープする必要があります。
また、次のトークンを文字列として取得することもできます この文字列をchar配列に変換する をテストし、 配列内の各文字が数字 であることをテストします。
例外に対処したくない場合、それは正しいと思います。
入力はたった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();