我正在完成学校作业,这一次我考虑使用switch语句,因为它看起来效率更高。
这只是一些基本的东西,但如果我输入一个字母,例如在那个数字1之后,例如它将返回案例1两次?
到目前为止,这是我整个班级的代码:
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
private int option;
public static void main(String[] args) {
Test t = new Test();
t.start();
t.optionMenu();
}
public void start() {
System.out.println("Make your choice:");
System.out.println("1: Play");
System.out.println("2: Options");
System.out.println("3: Exit");
}
public void optionMenu() {
try {
Scanner sc = new Scanner(System.in);
this.option = sc.nextInt();
System.out.println(this.option);
} catch (InputMismatchException e) {
System.out.println("Please enter a number");
optionMenu();
}
switch (this.option) {
case 1:
System.out.println("Game starting...");
break;
case 2:
System.out.println("Loading options");
break;
case 3:
System.out.println("Game exiting...");
System.exit(0);
break;
default:
System.out.println("Enter a valid number (1, 2 or 3");
break;
}
}
}
非常感谢任何帮助,谢谢!
答案 0 :(得分:1)
这只是一些基本的东西,但如果我输入一个字母,例如在那个数字1之后,例如它将返回案例1两次?
我不确定你的意思。首先,你的想法是有效的,这段代码应该没问题!
其次,如果您输入除了数字1,2或3之外的任何内容,您将转到“默认:”代码块。由于您再次提示用户失败,在提示中键入“a”或“a1”只会再次显示该菜单。用户只需键入“1”,“2”或“3”即可成功选择菜单选项。
答案 1 :(得分:1)
当您在没有先询问sc.nextInt()
的情况下致电if (sc.hasNextInt())
时,当最终用户开始输入意外输入(例如字母)时,您会遇到一些奇怪的行为。在这种情况下,扫描仪不会推进其读取指针,因此您的程序将被卡住读取相同的错误输出。
要解决此问题,请在尝试再次阅读int
之前添加一个“清除”无效条目的循环,如下所示:
while (!sc.hasNextInt()) {
System.out.print("You need to enter an integer.");
sc.nextLine(); // Clear out the bad input
}
int val = sc.nextInt(); // At this point we know that sc.hasNextInt(), because that's the loop condition
另一点是,使用迭代可以完成的递归不是一个好主意:对optionsMenu
的递归调用将累积与结束次数一样多的调用级别 - 用户输入的值不正确,因此非常持久的用户理论上可以通过重复输入无效数据来强制程序堆栈溢出。
使用上面的代码片段可以让您无需递归调用optionsMenu
,也可以捕获输入异常。