How can I repeatedly read user input using Scanner

2019-03-01 15:07发布

I am trying to create a simple menu for my program that reads user input. Here's the code:

public void menu() {
        String command;

        System.out.println("To operate with words write: a");
        System.out.println("To operate with products write: b");

        System.out.print("\nGive the command: ");
        Scanner scanner = new Scanner(System.in);
        command = scanner.nextLine();

        if (command.equals("a")) {
            System.out.println("\nGood job! You have chosen the word program\n");
            System.out.println("You can only use the following commands: ");
            System.out.println("exit - to exit the program");
            System.out.println("add - to add a word into the map");
            System.out.println("lookup - to lookup a word into the map\n");
            System.out.print("Give a command: ");
            command = scanner.next();
            while(scanner.hasNext()){
                command = scanner.next();
                if(command.equals("add")){
                    this.addWord();
                }

                System.out.print("Give a command: ");
                command = scanner.next(); //Here I get the ERROR that throws Exception
            }
        }

        scanner.close();
    }

public static void main(String [] args)
{
     HashTableInterface table = new HashTable(); 
     Dictionary d = new Dictionary(table); 
     RepositoryInterface repo = new Repository(d); 
     ControllerInterface controller = new Controller(repo); 
     Console c = new Console(controller); 
     c.menu()
}

And here's a test with the exception I get:

To operate with words write: a
To operate with products write: b

Give the command: a

Good job! You have chosen the word program

You can only use the following commands: 
exit - to exit the program
add - to add a word into the map
lookup - to lookup a word into the map

Give a command: add
add
Give the word: mar
Give the word's plural: mere
The hash code for mar is: 3
Give a command: Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:907)
    at java.util.Scanner.next(Scanner.java:1416)
    at console.Console.menu(Console.java:56)
    at test.Prog.main(Prog.java:26)

I removed the second command = scanner.next() from the while loop but then it let's me read user input only once. How can solve this?

UPDATE: the AddWord method:

public void addWord() {

        Scanner scanner = new Scanner(new InputStreamReader(System.in));

        System.out.print("Give the word: ");
        String word = scanner.nextLine();
        System.out.print("Give the word's plural: ");
        String plural = scanner.nextLine();
        scanner.close();

        controller.addTheWord(word, plural);
    }

标签: java input
3条回答
The star\"
2楼-- · 2019-03-01 15:19

Why not do something like this:

public class test {

private static Scanner scanner;

public static void main(String args[]) {
    scanner = new Scanner(System.in);
    printmenu();      
    getinput();
}

private static void printmenu(){
    System.out.println("To operate with words write: a");
    System.out.println("To operate with products write: b");
}

private static void getinput(){
    System.out.print("\nGive the command: ");
    String command = "";
    while (!scanner.hasNext()) {

    }
    command = scanner.next();

    if (command.equals("a")) {
        System.out.println("\nGood job! You have chosen the word program\n");
        System.out.println("You can only use the following commands: ");
        System.out.println("exit - to exit the program");
        System.out.println("add - to add a word into the map");
        System.out.println("lookup - to lookup a word into the map\n");
        System.out.print("Give a command: ");

        while(scanner.hasNext()){
            command = scanner.next();
            if(command.contains("add")){

                addWord();
            }
            else{
                System.out.println(command);
            }
            getinput();
        }
    }
    else{
        scanner.close();
    }
}

public static void addWord() {

    System.out.print("Give the word: ");
    String word = scanner.next();
    System.out.print("Give the word's plural: ");
    String plural = scanner.next();
    //controller.addTheWord(word, plural);
}

}

查看更多
走好不送
3楼-- · 2019-03-01 15:28

You should use switch case inside the while loop instead of if. The switch case should provide the functionality depending on the input provided by the user.

查看更多
萌系小妹纸
4楼-- · 2019-03-01 15:42

You can use

InputStreamReader str= new InputStreamReader (System.in);
BufferedReader uinp= new BufferedReader (str);
String val;
val= uinp.readLine();
while (!".".equals(val)) {
//do your stuff
//..and after done, read the next line of the user input.
val= uinp.readLine();
}
查看更多
登录 后发表回答