0

I'm working on a project and I already finished it, I have really simple problem which makes me really confused. I'm trying to ask a user to enter a number from a menu and depending on that different things happen, but I get input mismatch exception whenever I type space in between words. I get that error on the last line of the code, please check my code below, Thanks.

System.out.println("Enter: " + "\n1.Enter Name" +"\n2.Enter another name" + "\n3.Exit");
int userChoice = kb.nextInt();

while(userChoice != 3) {
    if(userChoice == 1) {
        System.out.println("Enter name");
        String name = kb.next();
    }
    if(userChoice == 2) {
        System.out.println("Enter anohter name");
        String anotherName = kb.next();
    }
    if(userChoice == 3)
        break;
    System.out.println("Enter: " + "\n1.Enter Nmame" +"\n2.Enter another name" + "\n3.Exit");
    userChoice = kb.nextInt();
}
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373

1 Answers1

1

The issue is with your usage of Scanner#next(), in combination with wanting to input multiple "words" sepearted by a whitespace for example. (Disclaimer: I understand your question in the way that you want to enter multiple words for the "name" input, this answer takes that as a prerequisite)

See following excerpt from the Scanner#next() Javadoc:

Finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern.

The default delimiter for the Scanner is a whitespace. So when you request a name from the user, and the user wants to enter "John Doe", only "John" will be read, and "Doe" will be left, most likely causing the error you are seeing.

The workaround I would propose is to use nextLine() to read the whole line while providing each input line by line.

However, be aware of this issue: Scanner is skipping nextLine() after using next() or nextFoo()?

Keeping that in mind, I would modify your code as follows:

String name = "";
String anotherName = "";
System.out.println("Enter: " + "\n1.Enter Nmame" +"\n2.Enter another name" + "\n3.Exit");
int userChoice = kb.nextInt();

while(userChoice != 3) {
    kb.nextLine(); // consumes the newline character from the input
    if(userChoice == 1) {
        System.out.println("Enter name");
        name = kb.nextLine(); // reads the complete line
        // do something with name
    } else if (userChoice == 2) {
        System.out.println("Enter another name");
        anotherName = kb.nextLine(); // reads the complete line
        // do something with anotherName
    }
    System.out.println("Enter: " + "\n1.Enter Nmame" +"\n2.Enter another name" + "\n3.Exit");
    userChoice = kb.nextInt();     
}

Sidenotes:

  • I moved the declaration of your name and anotherName variables, as they don't have to be re-declared everytime.
  • However you should actually do something with them (e.g. save them in a list, or create some object with them) otherwise they will be lost on the next loop iteration.
  • You can omit the check for if (userChoice == 3) since this would never happen in combination with the while (userChoice != 3).

Example input:

Enter: 
1.Enter Nmame
2.Enter another name
3.Exit
1
Enter name
John Doe
1.Enter Nmame
2.Enter another name
3.Exit
3
maloomeister
  • 2,461
  • 1
  • 12
  • 21