我正在尝试创建自定义异常类,但我遇到了很多麻烦。有人可以帮我吗!我刚刚开始编程,我希望得到一些指示。
import java.util.Random;
import java.util.Scanner;
import java.util.InputMismatchException;
public class GuessingGame {
public static void main(String[]args) throws BadGuessException
{
int min = 1;
int max = 10;
Random rand = new Random();
int numberToGuess = rand.nextInt((max - min) + 1) + min;
Scanner input = new Scanner(System.in);
int guess;
boolean win = false;
int numberOfTries = 0;
while (!win)
{
System.out.println("Guess a number between 1 and 10: ");
try
{
guess = input.nextInt();
numberOfTries++;
if (guess == numberToGuess)
{
win = true;
System.out.println("YOU GOT IT!");
System.out.println("It took you " + numberOfTries + " tires.");
}
else
{
throw new BadGuessException();
}
}
catch(InputMismatchException e)
{
e.getMessage();
}
}
}
}
import java.util.*;
public class BadGuessException extends Exception {
String message = "Sorry, that was an invalid guess!";
//Default Constructor
public BadGuessException()
{
super();
}
//Parameterized Constructor
public BadGuessException(Throwable cause)
{
super(cause);
}
}
我应该创建2个构造函数,一个默认值,一个参数化。如果用户输入1-10之间的数字,我应该在一个catch块中捕获它并打印消息"无效猜测"如果他们输入一个字母或其他东西,输出应该是"输入无效" (我应该在BadGuessException中捕获无效输入然后将其传递给InputMismmatch吗?如果是这样,我该怎么做?) 现在,当我运行这段代码时,如果我输入一个字母,它不会崩溃,但是while循环不断迭代,我无法再输入任何输入。它只是不断重复"猜数字在1-10之间。"
我假设它是因为一旦try块执行一次,它就不会再次执行了?我该如何解决?对不起任何困惑,很高兴澄清!任何帮助深表感谢。
另外,我不确定如何同时捕获2个不同的异常。一个用于无效猜测,一个用于无效输入。 :/
答案 0 :(得分:0)
我认为你想要的是如果他们猜测它是不正确的,你的循环应该再次运行,对吧?在这种情况下,您应该调整循环,如下所示。此外,在捕获InputMismatchException的地方,您正在吞下异常而不打印它或处理它:这是非常糟糕的做法。我也为你更新了这个。
while (!win)
{
System.out.println("Guess a number between 1 and 10: ");
try
{
guess = input.nextInt();
numberOfTries++;
win=true;
if (guess == numberToGuess)
{
win = true;
System.out.println("YOU GOT IT!");
System.out.println("It took you " + numberOfTries + " tires.");
}
else
{
throw new BadGuessException();
}
}
catch(InputMismatchException e)
{
System.out.println("Please input a number betwee 1 and 10!");
}
catch(BadGuessException ex) {
System.out.println("Sorry, you guessed the wrong number!");
}
}
答案 1 :(得分:0)
应该使用例外来处理错误,无效输入,非法,异常情况。如果没有猜测正确的数字是一个错误,那听起来不是一个心灵读者就是一个错误。所以BadGuessException
在这里被误用了。
为了更好的用例,如何为非感知输入抛出此异常?例如,由于程序要求用户输入1到10之间的数字,输入-3或99显然是错误。
可以相应地修正中间的循环:
while (!win) {
System.out.println("Guess a number between 1 and 10: ");
try {
guess = input.nextInt();
numberOfTries++;
if (guess == numberToGuess) {
win = true;
System.out.println("YOU GOT IT!");
System.out.println("It took you " + numberOfTries + " tires.");
} else if (guess < 1 || guess > 10) {
throw new BadGuessException();
}
} catch (InputMismatchException e) {
input.nextLine();
}
}
至于创建自定义异常类,您已经这样做了。它写得有点凌乱,清理它(删除不必要的东西)就变成了:
public class BadGuessException extends Exception {
private static final String message = "Sorry, that was an invalid guess!";
public BadGuessException() {
super(message);
}
}
我修复了代码中的另一个错误:如果输入非整数输入,则会抛出InputMismatchException
。反复。永远。
这是因为input.nextInt()
如果输入无效,则不会消耗输入。因此无效输入保持不变,input.nextInt()
将继续失败,使您的程序无限循环。
要解决此问题,您必须以某种方式消耗错误的输入,例如通过阅读以下行:
} catch (InputMismatchException e) {
input.nextLine();
}
答案 2 :(得分:0)
你永远不会捕获BadGuessException,因此它将被抛出while循环,程序将退出。如果要继续,必须在循环内捕获异常。
我同意janos的观点,即这不是对例外的好用。猜错是正常游戏流程的一部分,不是吗?
但是为了练习,我将例如将循环中的所有逻辑拉入一个新的私有方法,让它抛出这个异常,并在循环中捕获它。您可以像这样连续捕获多个异常。
while (!win) {
try {
win = makeGuess();
} catch (InputMismatchException e) {
e.getMessage();
} catch (BadGuessException e) {
System.out.println("Wrong guess");
}
}
private boolean makeGuess() throws BadGuessException, InputMismatchException {
...
}