我需要帮助使用错误的用户输入进行异常处理。我正在创建一个基于文本的游戏,欢迎用户,然后进入主菜单。然后它告诉用户选项,然后查找用户输入。出于某种原因,每当我输入1或2时,它会说:“您的输入无效,请再试一次”然后返回选择。我不知道到底哪里出错了,希望有人可以帮助我。此外,它也不会捕获Mismatch Exception。希望你能帮忙!谢谢,山丹
public static void main(String[] args) {
System.out.println("Welcome to Spec Ops!");
System.out.println("Please state your name:");
Scanner name = new Scanner(System.in);
String Name = name.next();
System.out.println("Hello "+Name);
mainMenu();
}
public static void mainMenu() {
System.out.println("1. Story Mode");
System.out.println("2. Infinant Combat");
Scanner input = new Scanner(System.in);
Object Selection = input.nextInt();
boolean validOption = true;
Integer x;
try {
x = (Integer)Selection;
} catch(ClassCastException cce){
System.out.println("Your input is invalid, please try again");
validOption = false;
} catch(InputMismatchException ime){
System.out.println("Your input is invalid, please try again");
validOption = false;
}
if(validOption) {
System.out.println("Hello!");
}
else {
mainMenu();
}
}
}
答案 0 :(得分:6)
Scanner.nextInt返回ant int,因此无需转到Object selection = scanner.nextInt()
,然后转换为int,您只能拥有int selection = scanner.nextInt()
并将其包围在try {catch {{{ 1}},这是用户键入字母而不是数字
答案 1 :(得分:0)
您可以暂时更改代码并使用Pokemon异常处理并检查堆栈跟踪以查看应该实现的异常类型:
try {
//do something
} catch(Exception e) {
//Gotta catch 'em all!
e.printStackTrace();
}
一旦你知道了确切的异常,就可以设置一些断点并相应地重构你的代码。
此外,您不必通过更改catch块中的布尔变量来控制程序的流程:
boolean isValidOption = false;
Integer x;
try {
x = (Integer)Selection;
isValidOption = true;
} catch...
答案 2 :(得分:0)
当您阅读名称时,您正在使用scanner.next()。这不会在行尾字符中读取,因此当您调用scanner.nextInt()时,它会读取新行并且无法解析为int。
您应该将名称读取更改为scanner.nextLine(),如果要处理来自用户的无效int输入,则对nextInt的调用需要位于try块中并捕获InputMismatchException而不是ClassCastException。