java - 在单词之间使用空格时输入不匹配异常
问题描述
我正在做一个项目,我已经完成了,我有一个非常简单的问题,这让我很困惑。我试图让用户从菜单中输入一个数字,并根据发生的不同情况而定,但是每当我在单词之间输入空格时,我都会收到输入不匹配异常。我在代码的最后一行得到了那个错误,请检查我的代码,谢谢。
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();
}
解决方案
问题在于您对 的使用Scanner#next()
,以及想要输入多个以空格分隔的“单词”,例如。(免责声明:我以您想为“名称”输入输入多个单词的方式理解您的问题,此答案以此为先决条件)
Scanner#next()
请参阅Javadoc的以下摘录:
从此扫描器中查找并返回下一个完整的令牌。一个完整的标记前后是匹配分隔符模式的输入。
的默认分隔符Scanner
是空格。因此,当您向用户请求名称,并且用户想要输入“John Doe”时,只会读取“John”,而会留下“Doe”,这很可能导致您看到的错误。
我建议的解决方法是nextLine()
在逐行提供每个输入的同时读取整行。
但是,请注意这个问题:Scanner is skipping nextLine() after using next() or nextFoo()?
牢记这一点,我将修改您的代码如下:
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();
}
旁注:
- 我移动了你的
name
和anotherName
变量的声明,因为它们不必每次都重新声明。 - 但是,您实际上应该对它们做一些事情(例如将它们保存在列表中,或用它们创建一些对象),否则它们将在下一次循环迭代中丢失。
- 您可以省略检查,
if (userChoice == 3)
因为这永远不会与while (userChoice != 3)
.
示例输入:
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
推荐阅读
- git - 在 Cent 上安装 Gitlab
- javascript - 代码未按顺序执行(Firebase)。同步问题
- java - 在java中将一个列表转换为另一个列表
- r - R xts lag() 函数仅滞后 1 个位置
- c - 当我运行 Valgrind 时,我的代码中出现大小为 8 的无效写入错误
- html - 如何定位一个 div,在 100% 宽度的 body 中,左右空间相同?
- rust - PhantomData 在 Rust 中究竟是如何工作的?
- go - Golang 中的路由仅使用 stdlib
- laravel - 未定义变量:myRoom(查看:(重音)
- c++ - 为什么 gcc 使用 _mm512_dpbusds_epi32 添加额外的 vmovdqa64 指令?