Java-Try/Catch不超过InputMismatchException

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

这是我的第一个Java程序。任务是创建一个程序,如下所示:

开发一个Java程序,其工作原理如下:

1) 。当程序启动时,它会显示一条欢迎玩家的消息:“欢迎来到游戏大师!”

2) 。然后它创建一个介于1和20之间的秘密随机数

3) ,然后它会显示一条消息:“猜猜我的神奇数字[1-20]:”

4) 。阅读并检查播放机输入的号码

          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"));