Java-Try/Catch不超过InputMismatchException
这是我的第一个Java程序。任务是创建一个程序,如下所示: 开发一个Java程序,其工作原理如下: 1) 。当程序启动时,它会显示一条欢迎玩家的消息:“欢迎来到游戏大师!” 2) 。然后它创建一个介于1和20之间的秘密随机数 3) ,然后它会显示一条消息:“猜猜我的神奇数字[1-20]:” 4) 。阅读并检查播放机输入的号码Java-Try/Catch不超过InputMismatchException,java,Java,这是我的第一个Java程序。任务是创建一个程序,如下所示: 开发一个Java程序,其工作原理如下: 1) 。当程序启动时,它会显示一条欢迎玩家的消息:“欢迎来到游戏大师!” 2) 。然后它创建一个介于1和20之间的秘密随机数 3) ,然后它会显示一条消息:“猜猜我的神奇数字[1-20]:” 4) 。阅读并检查播放机输入的号码 If is not a number, the program displays a message saying: "Should enter a n
If is not a number, the program displays a message saying: "Should enter a number". then go back to step 3)
If the number is out of range, the program displays a message saying: "Number out of range". Then go back to step 3)
If the number is smaller than the secret number, the program displays a message saying: "Number too small". Then go back to step 3)
If the number is greater than the secret number, the program displays a message saying: "Number too large". Then go back to step 3)
If the number is the same as the secret number, the program displays a message saying: "You got it!". Then go to step 5)
5) 。程序将显示一条消息:“想要更多游戏吗?”
6) 。阅读玩家的答案。如果回答为“是”,则转至步骤1);如果答案为“否”,则转至步骤7)
7) 。程序显示消息“感谢您玩游戏。再见”
我已经让它完全工作了,除了输入INT以外的任何东西都会产生异常。我自己也试着研究了一下,发现了Try/Catch,但它似乎对我不起作用。我的导师不会帮我…尽管事实上他没有教过我这些
这是我的密码:
public static void main(String[] args)
{
// TODO Auto-generated method stub
String more;
do
{
System.out.println("Welcome to Game Guru!");
int number = 1 + (int)(Math.random() * 20);
int guess = 0;
Scanner input = new Scanner(System.in);
try
{
System.out.println("Guess my magic number [1-20]: ");
guess = input.nextInt();
}
catch (Exception e)
{
System.out.println("Should enter an integer");
}
while (guess != number)
{
if (guess > 20 || guess < 1)
{
System.out.println("Number out of range");
System.out.println("Guess my magic number [1-20]: ");
guess = input.nextInt();
}
else if (guess < number)
{
System.out.println("Number too small");
System.out.println("Guess my magic number [1-20]: ");
guess = input.nextInt();
}
else if (guess > number)
{
System.out.println("Number too large");
System.out.println("Guess my magic number [1-20]: ");
guess = input.nextInt();
}
}
if (guess == number)
{
System.out.println("You got it!");
}
System.out.println("Want more games? Please enter Y or N.");
more = input.next();
} while (more.equals("y") || more.equals("Y"));
System.out.println("Thanks for playing the game. Goodbye");
}
我真的很感激你能深入了解这一点。我束手无策……我应该在谷歌上交学费。在尝试中,你给出了你想要执行的代码(很好)。在except语句中,您也正确地打印出了错误(很好) 不幸的是,你没有修好它
将try/catch放在while循环中可能是有意义的,该循环将重复,直到您获得有效的输入。这样,一旦它起作用,您就可以继续进行其他逻辑,这取决于在try/catch中从用户处获取有效输入。您要求输入一个int,如果用户以字符串或浮点形式输入另一个值,您将得到一个异常。
添加另一个try{}catch{}块以验证它是否为整数,否则将强制转换它代码中发生的情况是,它在第一次try/catch中捕获该异常,prints
System.out.println(“应输入整数”)代码>然后进入do
块的其余部分。在打印该消息后,您需要继续
然而,在继续测试时,您将在代码中遇到更多的bug,这只是为了回答您关于该异常的问题。因此,从
try
{
System.out.println("Guess my magic number [1-20]: ");
guess = input.nextInt();
}
catch (Exception e)
{
System.out.println("Should enter an integer");
}
基本上,如果发生异常,扫描仪
的缓冲区中仍然包含非数字数据,这意味着如果您再次尝试读取缓冲区,执行类似于
guess = input.nextInt();
您将再次得到相同的异常
一般的解决方案是调用input.nextLine()
,在尝试从缓冲区读取新数据之前清除缓冲区。就我个人而言,我会对所有输入使用nextLine
,并使用Integer.parseInt
解析那些您想要作为int
值的元素,但这就是我
由于每次用户需要猜测时,您都必须要求用户输入,因此您可以使用do while
循环来简化您的解决方案(您必须以任何方式至少进入循环一次),这样您就可以获得输入、验证值(作为int
)并对其执行所需的逻辑,都在一个基本循环中
Scanner input = new Scanner(System.in);
String more = "N";
do {
System.out.println("Welcome to Game Guru!");
int number = 1 + (int) (Math.random() * 20);
int guess = 0;
do {
try {
System.out.println("Guess my magic number [1-20]: ");
String text = input.nextLine();
guess = Integer.parseInt(text);
if (guess > 20 || guess < 1) {
System.out.println("Number out of range");
} else if (guess < number) {
System.out.println("Number too small");
} else if (guess > number) {
System.out.println("Number too large");
}
} catch (NumberFormatException e) {
System.out.println("Should enter an integer");
}
} while (guess != number);
System.out.println("You got it!");
System.out.println("Want more games? Please enter Y or N.");
more = input.nextLine();
} while (more.equalsIgnoreCase("y"));
扫描仪输入=新扫描仪(System.in);
String more=“N”;
做{
System.out.println(“欢迎来到游戏大师!”);
整数=1+(整数)(Math.random()*20);
int guess=0;
做{
试一试{
System.out.println(“猜我的魔法数字[1-20]:”;
String text=input.nextLine();
guess=Integer.parseInt(文本);
如果(猜测>20 | |猜测<1){
System.out.println(“数量超出范围”);
}else if(猜测<数字){
System.out.println(“数字太小”);
}否则如果(猜测>数字){
System.out.println(“数字太大”);
}
}捕获(数字格式){
System.out.println(“应输入整数”);
}
}while(猜测!=数字);
System.out.println(“明白了!”);
System.out.println(“想要更多游戏吗?请输入Y或N”);
more=input.nextLine();
}while(more.equalsIgnoreCase(“y”));
尝试/捕获的目的是告诉用户他们选择的数字不是整数。如果您输入的不是整数,则程序不应继续,如步骤4中所述-第一条if语句用于验证该数字是否为整数。
相反,您使用的是try/catch,这也会停止程序,但有点不同。
try语句中的代码块提示用户输入数字1-20。如果不是,则抛出异常,因为输入的数字不是整数。它打印消息“应该输入一个整数”,并打印出应该告诉用户错误的错误。它告诉您程序的主类中存在错误,以及问题所在。print语句“应该输入一个整数”的目的是在程序下次运行时提示用户输入一个整数,这样程序才能正确运行。
在您的情况下,使用if语句更有意义。同样,这段代码的唯一一点是验证用户是否输入了整数 这是因为即使在异常出现后,您仍继续进行计算。首先,如果您应该从PO异常更改为输入不匹配异常,则应将扫描仪
声明移动到循环之前,如果遇到输入不匹配异常
,则应添加继续
,以便再次转到循环的顶部。nextInt
不会删除缓冲区中的无效数据,因此下次调用nextInt
时,仍会在其中包含导致异常的无效数据。相反,您应该使用nextLine
删除有问题的数据
Scanner input = new Scanner(System.in);
String more = "N";
do {
System.out.println("Welcome to Game Guru!");
int number = 1 + (int) (Math.random() * 20);
int guess = 0;
do {
try {
System.out.println("Guess my magic number [1-20]: ");
String text = input.nextLine();
guess = Integer.parseInt(text);
if (guess > 20 || guess < 1) {
System.out.println("Number out of range");
} else if (guess < number) {
System.out.println("Number too small");
} else if (guess > number) {
System.out.println("Number too large");
}
} catch (NumberFormatException e) {
System.out.println("Should enter an integer");
}
} while (guess != number);
System.out.println("You got it!");
System.out.println("Want more games? Please enter Y or N.");
more = input.nextLine();
} while (more.equalsIgnoreCase("y"));