Как реализовать пользовательские исключения для угадайки
Я должен создать игру в угадайку, которая позволяет выполнять до 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 (и дополнительное предложение catch для NumberFormatException).
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.");
}
}
}
2 ответа
То, что только что сказал @Jack Flamp, совершенно правильно, но вы не хотите проверять, составляет ли предположение от 1 до 10 включительно, но совпадают ли предположения пользователя с вашим случайным числом.
if (guess == n) {
System.out.println("YOU WIN!\nIt took you " + turn + " attempts.");
} else {
throw new BadGuessException();
}
Если вы хотите, чтобы исключение генерировалось, когда переменная turn превышает 5, удалите его из условия while и сделайте if в начале области while:
if (turn > 5)
throw new TooManyGuessesException();
PS: заключите скобки в область видимости, иначе у вас сразу же возникнет исключение TooManyGuessesException
PS2: Я хотел бы прокомментировать сообщение Джека Флампа, но, поскольку у меня нет 50 репутации, я не могу.
Прежде чем сравнивать его с ответом, убедитесь, что введенный номер соответствует критериям:
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
утверждение, что проверяет, если очереди слишком много.