Как реализовать пользовательские исключения для угадайки

Я должен создать игру в угадайку, которая позволяет выполнять до 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 утверждение, что проверяет, если очереди слишком много.

Другие вопросы по тегам