2

我有以下 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。该代码使用没有空格的单个名称。有什么我想念的吗?

4

2 回答 2

3
    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" 作为下一个令牌,但这不是如果下一个标记与正则表达式不匹配,或者超出范围,则可以强制转换intInputMismatchException 。nextInt()InputMismatchException Integer

于 2013-04-22T04:18:43.380 回答
0

实际上,您的代码中的问题已被明确指出。在您的情况下,有两种典型的方法可以实现这一目标:

使用useDelimiter方法来分隔输入,在每个输入之后,您需要点击.Enter

将此扫描仪的分隔模式设置为从指定字符串构造的模式。

在您的情况下,您需要

    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。

于 2018-07-06T23:58:09.533 回答