我有以下Java代码:
Scanner input = new Scanner(System.in);
try {
System.out.println("Enter your name>>");
String name = input.next();
System.out.println("Enter your year of birth>>");
int age = input.nextInt();
System.out.println("Name: " + name);
System.out.println("Year of Birth: " + age);
System.out.println("Age: " + (2012 - age));
} catch (InputMismatchException err) {
System.out.println("Not a number");
}
当我输入带空格的名称时(例如" James Peterson"),我正确地得到下一行输出(输入您的出生年份),然后立即输入InputMismatchException。代码使用单个名称,不带空格。我有什么遗失的吗?
答案 0 :(得分:1)
System.out.println("Enter your name>>");
String name = input.next();
System.out.println("Enter your year of birth>>");
int age = input.nextInt();
Scanner,使用分隔符模式将其输入分解为标记,默认情况下匹配空格。
当您输入“James Peterson”时,Scanner#next()将“James”作为令牌并将其分配给String name
,然后您执行Scanner#nextInt()将“Peterson”作为下一个标记,但它不能转换为int
,因此InputMismatchException nextInt()
会抛出InputMismatchException
下一个标记与Integer
正则表达式不匹配,或者超出范围。
答案 1 :(得分:0)
实际上,已经明确指出了您的代码中的问题。对于您而言,有两种典型的实现方法:
使用useDelimiter方法来分隔输入,每次输入后,您需要点击 Enter
。
将此扫描仪的定界模式设置为根据指定的String构造的模式。
您需要的是
Scanner sc = new Scanner(System.in);
sc.setDelimiter("\\n");
// hit the "Enter" after each input for the field;
此外,您可以使用readLine
获得相同的结果将此扫描程序前进到当前行之后,并返回跳过的输入。此方法返回当前行的其余部分,但不包括最后的任何行分隔符。该位置设置为下一行的开头。
通过这种方式,您可以
Scanner sc = new Scanner(System.in);
System.out.println("Enter your name>>");
String name = sc.nextLine();
...
System.out.println("Enter your year of birth>>");
int age = sc.nextInt();
实际上,您可以以更严格的方式来实现它,如果需要,可以使用next(Pattern pattern)控制模式。
int age = sc.next(Pattern.compile("\\d+{1,3}"));
在这种情况下,如果输入不与pattern
匹配,则当输入为InputMismatchException
时,它将抛出nextInt
串。
当我输入带空格的名称(例如“ James Peterson”)时,我会正确输出下一行(输入您的出生年份>>),然后立即输入InputMismatchException。