簡體   English   中英

掃描儀的InputMismatchException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM