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()
会导致在输入 add
、list
或 exit
之后的多余的空行也被读取并作为输入处理。这是因为 nextLine()
会读取直到遇到换行符的所有字符,包括换行符本身。如果你在输入 add
、list
或 exit
之后按了 Enter 键,那么 nextLine()
会读取这个换行符,并认为是一个新的输入。
当你使用 nextLine()
来接收 name
变量时,如果输入的名字后面跟了一个换行符(即你按了 Enter 键),那么这个换行符会被 nextLine()
读取,并尝试匹配 case "add":
分支中的 System.out.println("请输入名字");
,从而导致 "请输入名字" 这行输出再次出现。同时,因为 nextLine()
读取了换行符,它认为你已经输入了名字,所以会尝试创建一个 Emp
对象,但由于没有提供有效的 id
,这会导致报错。
将 nextLine()
替换为 next()
解决了这个问题,因为 next()
只读取一个单独的词或令牌,不包括换行符。这样,你输入的 add
、list
或 exit
之后的多余空行就不会被处理,也不会影响后续输入。
为了修复这个问题,你应该在调用 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防止出错