[英]InputMismatchException with Scanner
我有以下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。 該代碼使用不帶空格的單個名稱。 有什么我想念的嗎?
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”作為下一個令牌,但不是如果下一個標記與Integer
正則表達式不匹配,或者超出范圍 ,則可以轉換為int
,因此InputMismatchException作為nextInt()
會拋出InputMismatchException
。
實際上, 您的代碼中的問題已經明確指出。 就您而言,有兩種典型的實現方法:
使用useDelimiter方法delimite的輸入與各輸入后,你需要打 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
不匹配,則當輸入為字符串時,它將在嘗試nextInt
時拋出InputMismatchException
。
當我輸入帶有空格的名稱(例如“ James Peterson”)時,我將正確輸出下一行(輸入您的出生年份>>),然后立即輸入InputMismatchException。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.