Scanner的InputMismatchException

时间:2013-04-22 04:14:55

标签: java exception exception-handling java.util.scanner inputmismatchexception

我有以下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。代码使用单个名称,不带空格。我有什么遗失的吗?

2 个答案:

答案 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();

P.S。

实际上,您可以以更严格的方式来实现它,如果需要,可以使用next(Pattern pattern)控制模式。

    int age = sc.next(Pattern.compile("\\d+{1,3}"));

在这种情况下,如果输入pattern匹配,则当输入为InputMismatchException时,它将抛出nextInt串。

  

当我输入带空格的名称(例如“ James Peterson”)时,我会正确输出下一行(输入您的出生年份>>),然后立即输入InputMismatchException。