首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java - Try/Catch未移过InputMismatchException

Java - Try/Catch未移过InputMismatchException
EN

Stack Overflow用户
提问于 2018-09-19 08:32:25
回答 5查看 398关注 0票数 0

这是我的第一个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)。程序显示消息“谢谢你玩这个游戏。Goobye”。

我已经让它完全工作了,除了当输入除INT以外的任何东西时,它都会给出一个异常。我试着自己研究一下,找到了Try/Catch,但它似乎对我不起作用。我的讲师不会帮助me...despite,因为他实际上没有教过这些……

下面是我的代码:

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)

我真的很感谢你对这一点的见解。我已经无计可施了……我应该付谷歌的学费。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-09-19 08:50:45

所以,从…开始。

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"));
票数 1
EN

Stack Overflow用户

发布于 2018-09-19 08:43:12

在试验中,你给出了你想要执行的代码(很好)。在except语句中,您也正确地打印出了错误。

不幸的是,你没有修复它!

将try/catch放在while循环中可能更有意义,该循环会一直重复,直到您获得有效的输入。这样,一旦它起作用了,您就可以继续逻辑的其余部分,这些逻辑依赖于在try/catch中从用户那里获得有效输入。

票数 0
EN

Stack Overflow用户

发布于 2018-09-19 08:44:17

你要求输入一个int,如果用户输入另一个字符串或浮点数形式的值,你会得到一个异常。添加另一个try{} catch{}块以验证它是否为Integer,否则强制转换它

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52396324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档