java - 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)
我真的很感激对此的任何见解。我束手无策......我应该向谷歌支付我的学费。
解决方案
那么,从...开始
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"));
推荐阅读
- python - 使用python通过正则表达式选择文本中的每个段落
- ios - swift - 应用程序在众多选择中的一个行中崩溃
- javascript - 在事件侦听器函数中加载本地 css 文件
- php - 在php中将变量显示为文本
- mysql - 检查记录是否存在返回错误结果
- linux - Jenkins - 错误 Chrome 无法启动:异常退出
- ios - 如何在 UITableViewController 中的任何位置交互弹出(滑动返回)?
- gtk - 如何通知小部件上的每个光标移动?
- php - 使用 Stripe 网关使用借记卡付款时出现 402
- javascript - 使用 ElasticSearch Bulk JavaScript API 中的脚本更新索引