我必须创建一个猜谜游戏,该猜谜游戏最多可以进行5次回合,并且用户输入必须介于1和10之间。如果不满足这些条件,则可能会引发两个自定义异常(BadGuessException和TooManyGuessesException)。由于无法确定如何让程序知道是否抛出并捕获这些自定义的异常,因此我坚持如何处理异常。
我为自定义异常创建了两个类:
public class BadGuessException extends Exception
{
/**
* no-arg constructor
*/
public BadGuessException()
{
super("Sorry, that was an invalid guess!");
}
/**
* parametrized constructor
* @param message String message passed to super class's constructor
*/
public BadGuessException(String message)
{
super(message);
}
}
public class TooManyGuessesException extends Exception
{
/**
* no-arg constructor
*/
public TooManyGuessesException()
{
super("Sorry, too many guesses!");
}
/**
* parametrized constructor
* @param guess integer value representing amount of guesses (turns)
*/
public TooManyGuessesException(int guess)
{
super("Sorry, you guessed " + guess + " times!");
}
}
在以下代码中,我试图在抛出TooManyGuessesException之前允许最多旋转五圈,并且试图处理小于1且大于10的数字输入的异常。只有一个try-catch块(以及NumberFormatException的额外catch子句)。
import java.util.Random;
import java.util.*;
public class GuessingGame
{
public static void main(String[] args)
{
//Scanner object to receive user input
Scanner keyboard = new Scanner(System.in);
//Create Random class object & random variable
Random rng = new Random();
int n = rng.nextInt(10 - 1 + 1) + 1;
//Create incrementor for guessing turns
int turn = 1;
//Create variable for user input (guess)
int guess;
try
{
while(guess != n && turn <= 5)
System.out.println("Guess a number between 1 and 10 inclusive.");
System.out.println("Hint: the answer is " + n);
guess = keyboard.nextInt();
turn++;
if(guess == n)
{
System.out.println("YOU WIN!\nIt took you " + turn + " attempts.");
}
}
catch(BadGuessException e | TooManyGuessesException e)
{
if(guess < 1 || guess > 10)
e.BadGuessException();
if(turn > 5)
e.TooManyGuessesException();
}
catch(NumberFormatException e)
{
System.out.println("Sorry, you entered an invalid number format.");
}
}
}
答案 0 :(得分:1)
在与答案进行比较之前,请先检查输入数字是否符合条件:
if (guess < 1 || guess > 10) {
throw new BadGuessException();
} else if (guess == n) {
System.out.println("YOU WIN!\nIt took you " + turn + " attempts.");
}
对于TooManyGuessesException
,由于将while
循环限制为一定次数的迭代结束,因此永远不会抛出该循环。从循环条件中删除turn
,并在if
语句中使用它来检查转弯是否过多。
答案 1 :(得分:1)
@杰克·弗兰普(Jack Flamp)所说的完全正确,但是您不想检查猜测是否在1到10之间(包括10和10),而是检查用户的猜测是否与您的随机数匹配。
if (guess == n) {
System.out.println("YOU WIN!\nIt took you " + turn + " attempts.");
} else {
throw new BadGuessException();
}
如果要在turn变量超过5时引发异常,请从while条件中将其删除,并在while范围的开始处输入if:
if (turn > 5)
throw new TooManyGuessesException();
PS:将括号放在while范围内,否则您将立即出现TooManyGuessesException
PS2:我想评论Jack Flamp消息,但是由于我没有50的声誉,所以我不能。