ReignOfComputer
ReignOfComputer

Reputation: 757

InputMismatchException with Scanner

I have the following Java code:

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");
    }

When I enter a name with a space (e.g. "James Peterson"), I get the next line output correctly (Enter your year of birth) and then an InputMismatchException immediately. The code works with a single name without spaces. Is there something I'm missing?

Upvotes: 3

Views: 5709

Answers (2)

Hearen
Hearen

Reputation: 7828

Actually the problem in your code has been clearly pointed out. In your case, there are two typical ways to achieve that:

One

Using useDelimiter method to delimite the input and after each input, you need to hit the Enter.

Sets this scanner's delimiting pattern to a pattern constructed from the specified String.

In your case, you need to

    Scanner sc = new Scanner(System.in);
    sc.setDelimiter("\\n");
    // hit the "Enter" after each input for the field;

Two

Also you can achieve the same result using readLine

Advances this scanner past the current line and returns the input that was skipped. This method returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line.

In this way, you can do

    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.

Actually you can achieve it in a more restrictive way, controlling the pattern using next(Pattern pattern), if you need it.

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

In this case, if the input DOES NOT match the pattern, it will throw InputMismatchException as you were trying to nextInt while the input is a string.

When I enter a name with a space (e.g. "James Peterson"), I get the next line output correctly (Enter your year of birth>>) and then an InputMismatchException immediately.

Upvotes: 0

AllTooSir
AllTooSir

Reputation: 49362

    System.out.println("Enter your name>>");
    String name = input.next();
    System.out.println("Enter your year of birth>>");
    int age = input.nextInt();

Scanner, breaks its input into tokens using a delimiter pattern, which by default matches whitespace.

When you enter "James Peterson", Scanner#next() takes "James" as a token and assigns it to String name and then you do a Scanner#nextInt() which takes "Peterson" as the next token, but it is not something which can be cast to int and hence the InputMismatchException asnextInt() will throw an InputMismatchException if the next token does not match the Integer regular expression, or is out of range.

Upvotes: 4

Related Questions