首页 > 解决方案 > Java - Try/Catch 不超过 InputMismatchException

问题描述

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

开发一个 Java 程序,其工作方式如下:

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

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)。程序显示消息“感谢您玩游戏。Goobye”。

我已经让它完全工作,除了输入除 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");

}

}

这是控制台:

Welcome to Game Guru!
Guess my magic number [1-20]: 
a
Should enter an integer
Number out of range
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Unknown Source)
at java.base/java.util.Scanner.next(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
Guess my magic number [1-20]: 
at Game.main(Game.java:46)

我真的很感激对此的任何见解。我束手无策......我应该向谷歌支付我的学费。

标签: java

解决方案


那么,从...开始

try
{
    System.out.println("Guess my magic number [1-20]: ");
    guess = input.nextInt();
}
catch (Exception e)
{
    System.out.println("Should enter an integer");
}

基本上,如果发生异常,Scanner它的缓冲区中仍然包含非数字数据,这意味着如果您再次尝试读取缓冲区,执行类似...

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

推荐阅读