Scanner输入next()和nextline()使用不恰当导致的错误

Scanner输入next()和nextline()使用不恰当导致的错误

public static void main(String[] args) {
    HashTable hashTable = new HashTable(7);
    Scanner scanner = new Scanner(System.in);
    while (true) {
        System.out.println("add:增加雇员");
        System.out.println("list:遍历雇员");
        System.out.println("exit:退出程序");
        String input = scanner.next();//nextline
        switch (input) {
            case "add":
                System.out.println("请输入id");
                int id = scanner.nextInt();
                System.out.println("请输入名字");
                String name = scanner.next();//nextline
                hashTable.add(new Emp(id,name));
                break;
            case "list":
                hashTable.display();
                break;
            case "exit":
                scanner.close();
                System.exit(0);
        }
    }
}

使用 scanner.nextLine() 会导致在输入 addlistexit 之后的多余的空行也被读取并作为输入处理。这是因为 nextLine() 会读取直到遇到换行符的所有字符,包括换行符本身。如果你在输入 addlistexit 之后按了 Enter 键,那么 nextLine() 会读取这个换行符,并认为是一个新的输入。

当你使用 nextLine() 来接收 name 变量时,如果输入的名字后面跟了一个换行符(即你按了 Enter 键),那么这个换行符会被 nextLine() 读取,并尝试匹配 case "add": 分支中的 System.out.println("请输入名字");,从而导致 "请输入名字" 这行输出再次出现。同时,因为 nextLine() 读取了换行符,它认为你已经输入了名字,所以会尝试创建一个 Emp 对象,但由于没有提供有效的 id,这会导致报错。

nextLine() 替换为 next() 解决了这个问题,因为 next() 只读取一个单独的词或令牌,不包括换行符。这样,你输入的 addlistexit 之后的多余空行就不会被处理,也不会影响后续输入。

为了修复这个问题,你应该在调用 scanner.nextLine() 之后添加一个 scanner.nextLine() 调用,以丢弃多余的空行。这样,只有在你真正按下 Enter 键输入名字时,才会触发 case "add": 分支。下面是修复后的代码片段:

case "add":
    System.out.println("请输入id");
    int id = scanner.nextInt();
    scanner.nextLine(); // 丢弃 nextInt() 读取后的换行符
    System.out.println("请输入名字");
    String name = scanner.nextLine(); // 正确读取名字
    hashTable.add(new Emp(id, name));
    break;

这样,在输入 id 之后按 Enter,然后输入 name 之后按 Enter,只会触发一次 "请输入名字" 的提示。同时,这也解决了使用 nextLine() 接收 name 时可能出现的错误。

还是建议使用next防止出错

猜你喜欢

转载自blog.csdn.net/m0_62261710/article/details/143256699